xp_cmdshell 并在 sql 服务器触发器中回显

xp_cmdshell and echo in sql server trigger

我正在尝试将一些数据和固定字符从 SQL 服务器 table 导出到文本文件。我需要将大量这样的行导出到文本文件中,因此我试图通过将它们放在一行中来减少声明和设置大量命令变量(这将极大地减少代码大小)。这是我正在尝试做的事情:

这很好用:

DECLARE @ClientID varchar(50)
SET @ClientID = (select ClientID from inserted)

DECLARE @CommandL1 varchar(512)
SET @CommandL1 = 'echo U1 '+@ClientID+'> c:\temp\file.txt'
exec master..xp_cmdshell @CommandL1

与上面完全相同的命令但写成一行(没有 DECLARE 和 SET,减少代码的首选方法)失败(我收到错误 - (第一个)'+' 附近的语法不正确):

exec master..xp_cmdshell 'echo U1 '+@ClientID+'> c:\temp\file.txt' --ERROR

我有很多类似上面的代码,想精简一下。此外,我想知道如何解决这个问题。提前感谢您的帮助(我尝试使用 ^ 作为转义字符,但没有成功)。如何更改第二行(如上所示带有 --ERROR)以使其正常工作?

Jd

根据 MSDN,您必须在动态 SQL 中保留该语句,这样命令 shell 就不会读取

exec master..xp_cmdshell 'echo U1 '+@ClientID+'> c:\temp\file.txt'

作为

echo U1 + @ClientID + '> c:\temp\file.txt'

xp_cmdshell 接受一个字符串参数,因此您需要像开始时那样先显式构建字符串。该参数在 + 之前的结束引号之后终止,因此 + 是一个语法错误,因为 xp_cmdshell 除了 NO_OUTPUT 作为可选参数之外,不期望在字符串参数之后有任何内容。因此它将您的 + 解释为不正确的参数。