当我使用sp_OAMethod写入文本文件时,没有任何显示

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;

Rhy*_*nes 6

@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)

  • 我尝试了这个,但收到错误“错误-2146828218打开文件。”,知道那是什么意思吗? (2认同)
  • -2146828218 是十六进制的 800A0046,这(根据 Google 的说法)可能是权限被拒绝的响应。请记住,这是在 SQL Server 计算机上运行,​​而不是在客户端计算机上运行,​​因此 @Path 在服务器上,并且 SQL Server 服务帐户需要权限才能创建该路径的文件。 (2认同)