2014-11-08 12 views
0

我試過如下:T-SQL EXEC與sp_exec

declare @var2 nvarchar(30) 
declare @qsql nvarchar(100) 

set @var2 = N'iddelegat' 

exec ('select max('+ @var2 + ') as IDexec from delegat'); 

set @qsql = 'select max(@varsp) as IDspexec from delegat'; 

exec sp_executesql @qsql, N'@varsp nvarchar(30)', @var2; 

而結果:

IDexec  IDspexec 
-----------------------  
500038  iddelegat 

我不明白爲什麼sp_executesql不返回相同的結果EXECUTE。正確的返回值僅在EXECUTE聲明中。看來sp_executesql不會計算字符串'iddelegat'來返回列。

回答

1

您不能參數化列名稱。

你嘗試基本相同,這樣做MAX(N'iddelegat')MAX(iddelegat)

動態SQL中使用這些的唯一方法是將它們直接連接成的字符串。

如果要這樣做,應該使用quotename函數來減輕SQL注入的可能性。

The curses and blessings of dynamic SQL

2

使用sp_executesql時,您不能參數列名或表名。因此,當您插入exec()中的值iddelegat時,您將獲得該列。如果將它作爲sp_executesql的參數,則會得到'iddelegat' - 具有列名稱的字符串。

您可以參數化的問題在SQL文檔中沒有很好地解釋。如果您dig far enough,你會得到這樣的:

這裏可以用參數

您可以使用參數佔位符文字值 - 對於任何 文本或數值。最常見的情況下,參數在搜索條件中用作單個行或組 (即,在SQL語句的WHERE或HAVING子句中)用作 佔位符。

這是在文檔的一個不起眼的部分,但它有正確的總體思路。

爲了幫助進一步理解這一點,SQL引擎可以使用參數編譯查詢來獲取執行計劃。爲此,它需要知道查詢中的實際列和表。額外值 - 參數 - 可以在編譯步驟後插入