M. *_*eri 3 t-sql sql-server text-files file-writing
我正在尝试使用可以传递输入内容的存储过程通过Transact-SQL写入文件。但是,每次我在SQL Server 2012中运行命令时,它都会显示Command(s) completed successfully.,但我导航到该文本文件,并且在那里看不到任何文本。任何想法可能出什么问题吗?
我的代码:
-允许实现OLE自动化- sp_configure'显示高级选项',1; 走 重新配置; 走 sp_configure'Ole自动化程序',1; 走 重新配置; 走 DROP PROC WriteToGSQL; -包含对文本文件进行实际写入的特定代码- 设置ANSI_NULLS ON 走 将QUOTED_IDENTIFIER设置为ON 走 创建PROC [dbo]。[WriteToGSQL] @Path VARCHAR(2000), @Text VARCHAR(2000年) 如 开始 宣告@Auto INT 声明@FileID INT 执行sp_OACreate'Scripting.FileSystemObject',@Auto OUT 执行sp_OAMethod @ Auto,'OpenTextFile',@ FileID OUT,@ Path,8、1 执行sp_OAMethod @ FileID,'WriteLine',Null,@ Text 执行sp_OADestroy @FileID 执行sp_OADestroy @Auto 结束 声明@File VARCHAR(2000); DECLARE @Txt VARCHAR(2000); SET @File ='C:\ xxxxxxxx \ xxxx \ test.txt'; SET @Txt ='工作正常吗?'; EXEC WriteToGSQL @File,@Txt;
@JeroenMostert应该为您指出正确的方向而名声在外,我只是将他的话说成SQL来帮助您(而且我在没有SSMS的情况下就这样做了,因此您可能需要花一些时间来解决)。
要重申Jeroen的观点,您需要通过检查返回值来确保每个sp_OA ...调用都能正常工作,并且需要在销毁对象之前在文件上调用Close方法。查看FileSystemObject的MSDN文档以获取进一步的想法。
DECLARE @hr int;
EXECUTE @hr = sp_OACreate 'Scripting.FileSystemObject', @Auto OUT
IF @hr <> 0
BEGIN
RAISERROR('Error %d creating object.', 16, 1, @hr)
RETURN
END
EXECUTE @hr = sp_OAMethod @Auto, 'OpenTextFile', @FileID OUT, @Path, 8, 1
IF @hr <> 0
BEGIN
RAISERROR('Error %d opening file.', 16, 1, @hr)
RETURN
END
EXECUTE @hr = sp_OAMethod @FileID, 'WriteLine', Null, @Text
IF @hr <> 0
BEGIN
RAISERROR('Error %d writing line.', 16, 1, @hr)
RETURN
END
EXECUTE @hr = sp_OAMethod @FileID, 'Close', Null, Null
IF @hr <> 0
BEGIN
RAISERROR('Error %d closing file.', 16, 1, @hr)
RETURN
END
EXECUTE @hr = sp_OADestroy @FileID
EXECUTE @hr = sp_OADestroy @Auto
Run Code Online (Sandbox Code Playgroud)