我正在尝试使用可以将输入传递给的存储过程使用Transact-SQL写入文件。但是,每次我在SQL Server 2012中运行命令时,它都显示Command(s) completed successfully.
,但我导航到文本文件,我看不到任何文本。知道会出现什么问题吗?
我的代码:
-- GRANTS PERMISSION TO OLE AUTOMATION -- sp_configure 'show advanced options', 1; GO RECONFIGURE; GO sp_configure 'Ole Automation Procedures', 1; GO RECONFIGURE; GO DROP PROC WriteToGSQL; -- ENCAPSULATING THE SPECIFIC CODE THAT DOES THE ACTUAL WRITING TO THE TEXT FILE -- SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROC [dbo].[WriteToGSQL] @Path VARCHAR(2000), @Text VARCHAR(2000) AS BEGIN DECLARE @Auto INT DECLARE @FileID INT EXECUTE sp_OACreate 'Scripting.FileSystemObject', @Auto OUT EXECUTE sp_OAMethod @Auto, 'OpenTextFile', @FileID OUT, @Path, 8, 1 EXECUTE sp_OAMethod @FileID, 'WriteLine', Null, @Text EXECUTE sp_OADestroy @FileID EXECUTE sp_OADestroy @Auto END DECLARE @File VARCHAR(2000); DECLARE @Txt VARCHAR(2000); SET @File = 'C:\xxxxxxxx\xxxx\test.txt'; SET @Txt = 'Did it work?'; EXEC WriteToGSQL @File, @Txt;
答案 0 :(得分:3)
@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