2014-04-01 47 views
1

試圖與沒有成功sp_executesql的運行運行xp_cmdshell xp_cmdshell的,數據庫是SQL服務器2008R2使用sp_executesql的具有可變

這裏是SQL

DECLARE @sql nvarchar(max) = N'EXEC xp_cmdshell ''BCP "SELECT data FROM TableA WHERE id = @id" queryout C:\Temp\test.dat -T -N''' 
EXEC sp_executesql @sql, N'@id numeric(19, 0)', @id = 1234 

的錯誤是

Error = [Microsoft][SQL Server Native Client 10.0][SQL Server]Must declare the scalar variable "@id". 

請幫助,謝謝!

+0

難道你忘了申報@id? DECLARE @id numeric(19,0); –

+0

@MihaiHantea我在sp_executesql的參數列表中做了這個。 – user1589188

回答

1

該錯誤是由於在一個轉義子串的串@sql作爲@id可變參考(即,BCP串被使用xp_cmdshell執行)。所以,你可以剛剛逃避的是子串的。

DECLARE @id NUMERIC(19, 0) 
DECLARE @sql NVARCHAR(MAX) 

SET @id = 1234 
SET @SQL = N'DECLARE @BCP NVARCHAR(4000); 
SET @BCP = ''BCP "SELECT data FROM TableA WHERE id = '' 
      + CONVERT(NVARCHAR(30), @id) + N''" queryout C:\Temp\test.dat -T -N''; 
PRINT @BCP 
EXEC xp_cmdshell @BCP; 
' 

EXEC sp_executesql @sql, N'@id NUMERIC(19, 0)', @id = 1234 

但是,這仍然比這裏所需要的更努力。正好連接的@id值到字符串,然後使用EXEC()。有沒有必要使用sp_executesql的,你不需要緩存查詢計劃的性能優勢。

DECLARE @id NUMERIC(19, 0) 
DECLARE @sql NVARCHAR(MAX) 
SET @id = 1234 
SET @SQL = N'EXEC xp_cmdshell ''BCP "SELECT data FROM TableA WHERE id = ' 
      + CONVERT(NVARCHAR(30), @id) + N'" queryout C:\Temp\test.dat -T -N''' 

PRINT @SQL 
EXEC(@SQL) 
+0

是的,謝謝,這是我可以做的解決方法,但那不是我的問題。我的問題是關於爲什麼它不以這種方式工作。 – user1589188

+0

@ user1589188:這不是解決方法;這是您嘗試完成的更清晰的解決方案。但是,我確實更新了我的答案以反映這個具體問題。我可以再次更新以顯示它的一個例子。 –

+0

是的編輯感謝。再次分階段提出問題「如何使用sp_executesql在內部運行帶有變量的xp_cmdshell」。如果這是sp_executesql的限制,則不可能是可以接受的答案。 – user1589188

2

問題是變量@id在過程xp_cmdshell的範圍中不存在。 換句話說,@id不會被替換爲字符串SELECT data FROM TableA WHERE id = @id中的實際值。更好的替代稱爲@id的變量,然後執行查詢。

SET @sql = REPLACE(@sql,'@id',@id); 

您的代碼更新:

DECLARE @id NUMERIC(19, 0) 
SET @id = 3087 

DECLARE @sql nvarchar(max) = N'EXEC xp_cmdshell ''BCP "SELECT data FROM TableA WHERE id = @id" queryout "C:\Temp\test.dat" -T -N ''' 
SET @sql = REPLACE(@sql,'@id',@id); 
EXEC sp_executesql @sql 
+0

啊,是的,一個字符串替換這裏的伎倆。但它的目的是讓參數列表(例如多個參數需要有多個REPLACE)並且不再是參數列表。雖然聰明,但我認爲srutzky的答案更接近問題的本質。 – user1589188