xp_cmdshell和SQL服务器触发器中的回显
问题描述:
我想从SQL Server表中导出一些数据和固定字符到文本文件。我需要将大量这样的行导出到文本文件,所以我试图通过将DECLARing和大量命令变量放在一行中来减少代码的大小。这就是我要做的:xp_cmdshell和SQL服务器触发器中的回显
这工作得很好:
DECLARE @ClientID varchar(50)
SET @ClientID = (select ClientID from inserted)
DECLARE @CommandL1 varchar(512)
SET @CommandL1 = 'echo U1 '[email protected]+'> c:\temp\file.txt'
exec master..xp_cmdshell @CommandL1
相同的指令同上,但写成一行(不声明和SET,首选的方式去减少代码)失败(我得到的错误 - 附近有语法错误(第一个)“+”):
exec master..xp_cmdshell 'echo U1 '[email protected]+'> c:\temp\file.txt' --ERROR
我有很多类似上面的代码,所以想节约线路。另外,我想知道如何解决这个问题。感谢您提前提供任何帮助(我尝试使用^作为转义字符,但没有成功)。如何更改第二行(如上所示,使用--ERROR),以便它正常工作?
JD
答
据MSDN,你将不得不保持这种说法在动态SQL使得命令shell不读
exec master..xp_cmdshell 'echo U1 '[email protected]+'> c:\temp\file.txt'
为
echo U1 + @ClientID + '> c:\temp\file.txt'
xp_cmdshell
需要一个字符串参数,因此您需要首先显式构建字符串,就像您在开始时所做的那样。由于xp_cmdshell
不是NO_OUTPUT
之外的字符串参数,因此xp_cmdshell
作为可选参数,因此该参数在+之前的结束引号后终止。所以它将你的+解释为一个不正确的参数。
什么是ClientID设置?另外,我想你在第一个语句中有一个额外的'@ CommandL1 – scsimon
'的设置,我将ClientID设置为SET @ClientID =(从插入中选择ClientID);这部分工作正常,并且在表插入/更新之后,使用第一种方法将正确的ClientID导出到文本文件。你对额外的事情绝对正确“ - 我现在编辑了它。感谢您的回复。 – Jay
所以'ClientID'是一个'INTEGER'或者它是'VARCHAR'?你确定在你的子选择'(选择插入的ClientID)'中只返回1行(记录/值)吗? – scsimon