Sql server 当我使用sp_方法写入文本文件时,没有显示任何内容
我正在尝试使用Transact-SQL使用可以将输入传递给的存储过程写入文件。但是,每次我在SQL Server 2012中运行命令时,它都会显示成功完成的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
命令。
,但我导航到文本文件,在那里看不到任何文本。知道会出什么问题吗
我的代码:
-- 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,但没有关闭行。