Sql server 当我使用sp_方法写入文本文件时,没有显示任何内容

Sql server 当我使用sp_方法写入文本文件时,没有显示任何内容,sql-server,tsql,text-files,file-writing,Sql Server,Tsql,Text Files,File Writing,我正在尝试使用Transact-SQL使用可以将输入传递给的存储过程写入文件。但是,每次我在SQL Server 2012中运行命令时,它都会显示成功完成的命令。,但我导航到文本文件,在那里看不到任何文本。知道会出什么问题吗 我的代码: -- GRANTS PERMISSION TO OLE AUTOMATION -- sp_configure 'show advanced options', 1; GO RECONFIGURE; GO sp_configure 'Ole Automat

我正在尝试使用Transact-SQL使用可以将输入传递给的存储过程写入文件。但是,每次我在SQL Server 2012中运行命令时,它都会显示成功完成的
命令。
,但我导航到文本文件,在那里看不到任何文本。知道会出什么问题吗

我的代码:

-- 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; --授予OLE自动化的权限-- sp_配置“显示高级选项”,1; 去 重新配置; 去 sp_配置“Ole自动化程序”,1; 去 重新配置; 去 DROP PROC WriteToGSQL; --封装实际写入文本文件的特定代码-- 将ANSI_空值设置为ON 去 在上设置带引号的\u标识符 去 创建过程[dbo].[WriteToGSQL] @Path VARCHAR(2000年), @Text VARCHAR(2000年) 作为 开始 声明@autoint 声明@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); 声明@Txt VARCHAR(2000年); SET@File='C:\xxxxxxxx\xxxx\test.txt'; SET@Txt='它起作用了吗?'; EXEC WriteToGSQL@File,@Txt;
@Jeroemostert为您指出了正确的方向,这是值得称赞的,我只是将他的话输入SQL来帮助您(我在做这件事时没有SSMS,所以您可能需要稍微仔细检查一下)

要重新迭代Jeroen的点,您需要确保每个sp_OA。。。调用通过检查返回值来工作,在销毁对象之前,需要对文件调用Close方法。请查看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
DECLARE@hr int;
执行@hr=sp_OACreate'Scripting.FileSystemObject',@Auto OUT
如果@hr 0
开始
RAISERROR('创建对象时出现错误%d',16,1,@hr)
返回
结束
执行@hr=sp_OAMethod@Auto,'OpenTextFile',@FileID OUT,@Path,8,1
如果@hr 0
开始
RAISERROR('打开文件时出现错误%d',16,1,@hr)
返回
结束
执行@hr=sp_OAMethod@FileID,'WriteLine',Null,@Text
如果@hr 0
开始
RAISERROR('写入行时出现错误%d',16,1,@hr)
返回
结束
执行@hr=sp_OAMethod@FileID,'Close',Null,Null
如果@hr 0
开始
RAISERROR('关闭文件时出现错误%d',16,1,@hr)
返回
结束
执行@hr=sp_OADestroy@FileID
执行@hr=sp_OADestroy@Auto

您没有检查对
sp_OACreate
sp_OAMethod
的任何调用的返回值,因此无法查看是否有任何错误。将返回值与
sp\u OAGetErrorInfo
结合使用。请参阅以获取示例。一件看起来明显“错误”的事情是,您没有对文本文件调用
Close
。只需调用
sp_OADestroy
即可摆脱对象,并可能阻止流刷新其内容。(我没有实际使用它的经验,所以这只是猜测。)@Jeroenmoster感谢您的回复。很抱歉,我是TSQL新手,所以我不太熟悉sp_OA功能。我看了MSDN的例子,但运气不好,你能告诉我你的意思吗?我试过了,但我得到了错误“error-2146828218 opening file.”,你知道这是怎么回事吗?-2146828218是800A0046,十六进制,这(根据谷歌)可能是一个拒绝许可的响应。请记住,这是在SQL Server计算机上运行的,而不是在客户端计算机上,因此@Path在服务器上,SQL Server服务帐户需要权限才能创建该路径的文件。感谢您的响应!是的,我想这可能是一个权限错误:/。那么,我该如何给SQL Server服务帐户创建一个文件呢?好吧,不是为了混淆视听,但这段代码对我来说失败了。close方法特别给出了错误0xC0000005(异常\访问\冲突),我最终使用了EXECUTE@@hr=sp\u OADestroy@@FileID,但没有关闭行。