链接服务器、结果查询xp_cmdshell到表的迁移 SQL Server 2005 到 SQL Server 2019

Linked servers, results query xp_cmdshell to table migration SQL Server 2005 to SQL Server 2019

提问人:wielebny 提问时间:3/29/2022 最后编辑:wielebny 更新时间:3/29/2022 访问量:300

问:

我正在将过程从 SQL Server 2005 Microsoft迁移到 SQL Server 2019 Microsoft,但在尝试将链接服务器中的查询结果xp_cmdshell插入表时卡住了

我没有想法了

Microsoft SQL Server 2005 中的旧解决方案:

INSERT INTO LOGTABLE (ShopNo,Line) SELECT 1, OUTPUT FROM openquery ([IP_LINKED_SERV],'set fmtonly off; exec master..xp_cmdshell ''type d:\log\file.log'' ')

Microsoft SQL Server 2019 给我错误:

消息 11519,级别 16,状态 1,过程
sp_describe_first_result_set,第 1 行 [批处理启动行 0] 无法确定元数据,因为语句“exec master..xp_cmdshell“键入 d:\log\file.log”将调用扩展存储过程。

我找到了一种如何在链接服务器上在 SQL Server 2019 中执行xp_cmdshell的方法

EXEC ('set fmtonly off;exec master..xp_cmdshell ''type d:\log\file.log'' ') AT [IP_LINKED_SERV]

但是,我无法将此结果插入表中

INSERT INTO LOGTABLE (ShopNo,Line) SELECT '998', OUTPUT FROM EXEC ('set fmtonly off;exec master..xp_cmdshell ''type d:\log\file.log'' ') AT [IP_LINKED_SERV]

关键字“EXEC”附近的语法不正确。

SQL2005 中过程的一部分:

DECLARE TableCursor CURSOR FOR
SELECT IP, SqlUser, SqlPass, Object   FROM ..ObjectInfo

OPEN TableCursor

FETCH NEXT FROM TableCursor INTO @Ip, @SqlUser, @SqlPass, @Object
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @Object
SELECT @PARAMS = ' @tmp_object varchar(5) OUTPUT'
set @SQL = 'INSERT INTO LOGTABLE (Object,Line) SELECT @tmp_object, output FROM  openquery (['+@Ip+'],''set fmtonly off;
exec master..xp_cmdshell ''''type d:\log\file.log''''
'')' 

BEGIN TRY
EXECUTE sp_executesql @SQL,@PARAMS, @tmp_object = @Object OUTPUT
END TRY
BEGIN CATCH
INSERT INTO LOGTABLE (Object, Line) VALUES(@Object, '-error')
END CATCH```
sql-server sql-server-2019 xp-cmdshell

评论

0赞 Thom A 3/29/2022
从 exec 插入数据的正确语法是 ;不。INSERT INTO... EXECINSERT INTO ... SELECT ... FROM EXEC
2赞 Thom A 3/29/2022
当然,真正的问题是,你为什么要在这里使用。老实说,您似乎应该使用其他东西来使用日志文件数据并将其放入表中;T-SQL 不是编写任何脚本语言,尝试像使用语言一样使用它总是会遇到困难。xp_cmdshellINSERT
1赞 Charlieface 3/29/2022
远程执行它的另一种方法是 .我附议一个问题:你为什么要这样做?IP_LINKED_SERV.master.sys.xp_cmdshell
0赞 wielebny 3/29/2022
我需要使用 SELECT,因为查询是在 700 个对象 (AT ['+@Ip+']) 上运行的,所以我在第一列中输入对象编号,在第二列中输入对象(日志文件的内容)的结果xp_cmdshell。这是程序的一部分。也许还有其他方法可以在链接服务器上加载文件的内容?对象上的SQL EXPRESS版本,我无法在Windows中本地添加任务计划程序。在中央服务器上,我在 Windows 中具有标准版和管理员权限。
0赞 Thom A 3/29/2022
查询在 700 个对象上运行是什么意思? 正在对文件使用。你是说它针对 700 个不同的文件运行吗?使用适当的 ETL 工具或中间件的更多理由。xp_cmdhsell

答: 暂无答案