Sql server sql server触发器中的xp\u cmdshell和echo

Sql server sql server触发器中的xp\u cmdshell和echo,sql-server,triggers,escaping,echo,xp-cmdshell,Sql Server,Triggers,Escaping,Echo,Xp Cmdshell,我正在尝试将一些数据和固定字符从SQLServer表导出到文本文件。我需要将大量这样的行导出到文本文件中,因此我试图通过将大量命令变量放在一行中来减少声明和设置,这将极大地减少代码大小。以下是我试图做的: 这很好: DECLARE @ClientID varchar(50) SET @ClientID = (select ClientID from inserted) DECLARE @CommandL1 varchar(512) SET @CommandL1 = 'echo U1 '+@Cl

我正在尝试将一些数据和固定字符从SQLServer表导出到文本文件。我需要将大量这样的行导出到文本文件中,因此我试图通过将大量命令变量放在一行中来减少声明和设置,这将极大地减少代码大小。以下是我试图做的:

这很好:

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

根据,您必须将该语句保存在动态SQL中,以便命令shell不会读取

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

xp_cmdshell接受一个字符串参数,因此您需要首先显式地构建字符串,正如您在开始时所做的那样。参数在+前面的结束引号后终止,因此+是一个语法错误,因为xp_cmdshell不希望字符串参数后面有任何内容,除了作为可选参数的NO_输出。因此,它将+解释为不正确的参数

根据,您必须将该语句保存在动态SQL中,以便命令shell不会读取

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


xp_cmdshell接受一个字符串参数,因此您需要首先显式地构建字符串,正如您在开始时所做的那样。参数在+前面的结束引号后终止,因此+是一个语法错误,因为xp_cmdshell不希望字符串参数后面有任何内容,除了作为可选参数的NO_输出。因此,它将+解释为不正确的参数

客户ID设置为什么?另外,我认为您在第一条语句中还有一个额外的“设置”@CommandL1I get ClientID as SET@ClientID=select ClientID from inserted;这部分工作正常,在插入/更新表之后,使用第一种方法将正确的ClientID导出到文本文件中。你说得对极了,我现在已经编辑好了。谢谢你的回复。那么ClientID是整数还是VARCHAR?是否确定在子选择select ClientID from inserted中只返回1行记录/值?我将其声明为varchar-DECLARE@ClientID varchar50-是,只返回一条记录。由于第一组三行代码正常工作,我认为问题在于xp_cmdshell如何解释第二个一行代码-当我在SQL查询窗口中运行它时,它在+附近表示不正确的语法。根据xp_cmdshell的SSIS示例,它似乎根本不接受动态生成的字符串。您可以尝试将其放置在CAST或CONVERT语句中,以查看是否可以解决此问题-exec xp_cmdshell CONVERTvarcharmax,'echo U1'++@ClientID++'>c:\temp\file.txt'ClientID设置为什么?另外,我认为您在第一条语句中还有一个额外的“设置”@CommandL1I get ClientID as SET@ClientID=select ClientID from inserted;这部分工作正常,在插入/更新表之后,使用第一种方法将正确的ClientID导出到文本文件中。你说得对极了,我现在已经编辑好了。谢谢你的回复。那么ClientID是整数还是VARCHAR?是否确定在子选择select ClientID from inserted中只返回1行记录/值?我将其声明为varchar-DECLARE@ClientID varchar50-是,只返回一条记录。由于第一组三行代码正常工作,我认为问题在于xp_cmdshell如何解释第二个一行代码-当我在SQL查询窗口中运行它时,它在+附近表示不正确的语法。根据xp_cmdshell的SSIS示例,它似乎根本不接受动态生成的字符串。您可以尝试将其放在CAST或CONVERT语句中,看看是否可以解决此问题-exec xp_cmdshell CONVERTvarcharmax,'echo U1'+@ClientID+'>c:\temp\file.txt'非常感谢。更多的工作,但至少它能完成任务。谢谢你的帮助,没问题。我添加了更多关于参数终止的内容。SQL中的最后一个“将作为字符串参数的结尾。非常感谢。更多的工作,但至少它能完成任务。谢谢你的帮助,没问题。我添加了更多关于参数终止的内容。SQL中的“最后一个”将作为字符串参数的结尾读取。