【问题标题】:When I write to a text file using sp_OAMethod nothing shows up当我使用 sp_OAMethod 写入文本文件时,没有任何显示
【发布时间】:2016-10-19 10:37:56
【问题描述】:

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

我的代码:

-- 授予 OLE 自动化权限 -- sp_configure '显示高级选项', 1; 走 重新配置; 走 sp_configure 'Ole 自动化程序', 1; 走 重新配置; 走 删除过程 WriteToGSQL; -- 封装实际写入文本文件的特定代码 -- 设置 ANSI_NULLS ON 走 设置 QUOTED_IDENTIFIER ON 走 创建过程 [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); 声明 @Txt VARCHAR(2000); SET @File = 'C:\xxxxxxxx\xxxx\test.txt'; SET @Txt = '成功了吗?'; 执行 WriteToGSQL @File, @Txt;

【问题讨论】:

  • 您没有检查对sp_OACreatesp_OAMethod 的任何调用的返回值,因此无法查看是否有任何问题。将返回值与sp_OAGetErrorInfo 结合使用。有关示例,请参阅 MSDN
  • 看起来明显“错误”的一件事是您没有在文本文件上调用Close。只需调用sp_OADestroy 即可摆脱对象,并可能阻止流刷新其内容。 (我没有实际使用它的经验,所以这是猜测。)
  • @JeroenMostert 感谢您的回复。抱歉,我是 TSQL 新手,所以我对 sp_OA 功能不是很熟悉。我查看了 MSDN 示例,但没有运气,您能告诉我您的意思吗?

标签: sql-server tsql text-files file-writing


【解决方案1】:

@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

【讨论】:

  • 我试过这个,但我收到错误“错误 -2146828218 打开文件。”,知道这是怎么回事吗?
  • -2146828218 是十六进制的 800A0046,(根据 Google 的说法)可能是权限被拒绝响应。请记住,这是在 SQL Server 计算机上运行的,而不是在客户端计算机上,因此 @Path 在服务器上,并且 SQL Server 服务帐户需要权限才能创建该路径的文件。
  • 感谢您的回复!是的,我认为这将是一个权限错误:/。那我怎么给SQL Server服务账号创建文件呢?
  • 好吧,不要搅浑水,但这段代码对我来说失败了。 close 方法特别给出了错误 0xC0000005 (EXCEPTION_ACCESS_VIOLATION),我最终使用 EXECUTE @@hr = sp_OADestroy @@FileID 没有关闭行。
猜你喜欢
  • 2018-08-09
  • 1970-01-01
  • 2022-11-19
  • 1970-01-01
  • 2017-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
相关资源
最近更新 更多