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

标签 sql-server tsql 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

创建过程 [dbo].[WriteToGSQL]

@Path VARCHAR(2000),
@Text VARCHAR(2000)

作为

开始

声明@Auto INT
声明@FileID INT

EXECUTE sp_OACreate 'Scripting.FileSystemObject', @Auto OUT
执行 sp_OAMethod @Auto, 'OpenTextFile', @FileID OUT, @Path, 8, 1
EXECUTE sp_OAMethod @FileID, 'WriteLine', Null, @Text
执行 sp_OADestroy @FileID
EXECUTE sp_OADestroy @Auto

结尾

声明@File VARCHAR(2000);
声明@Txt VARCHAR(2000);

SET @File = 'C:\xxxxxxxx\xxxx\test.txt';
SET @Txt = '成功了吗?';

EXEC WriteToGSQL @File, @Txt;

最佳答案

@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

关于sql-server - 当我使用 sp_OAMethod 写入文本文件时,没有任何显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37884131/

相关文章:

sql-server - 如何使按查询分组更快?

sql-server - 聚簇索引

sql-server - NLog 数据库目标和 SQL Server 应用程序角色

sql - T-Sql 获取行数相同的值

java - 无论程序是从 jar 还是从 IDE 运行,如何将文件写入正确的目录?

c++:如何将整数添加到字符串

sql-server - Microsoft Codename "Data Transfer"标识列错误

sql-server-2005 - 语句 "USE @dbname"不起作用,为什么?怎么做?

sql-server - T-SQL : WHERE clause in OVER(PARTITION BY. .. 排序依据...)

VB.NET - 读取包含制表符分隔的整数/ double 的文本文件并将它们存储在数组中