2017-03-21 59 views
1

我想从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

+0

什么是ClientID设置?另外,我想你在第一个语句中有一个额外的'@ CommandL1 – scsimon

+0

'的设置,我将ClientID设置为SET @ClientID =(从插入中选择ClientID);这部分工作正常,并且在表插入/更新之后,使用第一种方法将正确的ClientID导出到文本文件。你对额外的事情绝对正确“ - 我现在编辑了它。感谢您的回复。 – Jay

+0

所以'ClientID'是一个'INTEGER'或者它是'VARCHAR'?你确定在你的子选择'(选择插入的ClientID)'中只返回1行(记录/值)吗? – scsimon

回答

0

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作为可选参数,因此该参数在+之前的结束引号后终止。所以它将你的+解释为一个不正确的参数。

+0

非常感谢。更多的工作,但至少它会完成这项工作。我感谢您的帮助。 – Jay

+0

没问题。我添加了一些关于参数终止的信息。 SQL中的最后'将作为字符串参数的结尾读取。 – scsimon