2017-03-21 57 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