2010-04-28 211 views

回答

15

它知道什麼之前的@a的價值是你不能這樣做,因爲SQL編譯(我假設在現實中你會希望@a是一些參數並不像你的例子那樣硬編碼)。

相反,你可以這樣做:

declare @a as varchar; 
set @a='TEST' 

declare @sql nvarchar(max) 
set @sql = 'select [' + replace(@a, '''', '''''') + '] from x' 

exec sp_executesql @sql 

但要注意,這是一個安全漏洞(SQL注入攻擊),所以如果你不能信任或好乾淨@a不應該做的。

+1

除非你讀這個先不使用動態SQL: http://www.sommarskog.se/dynamic_sql.html – HLGEM 2010-04-28 16:52:46

1

因爲列名在運行時的SQL語句在編譯時決定不。

3

使用sp_executesql

Example 
SET @SQLString = N'SELECT * 
    FROM table1 
    WHERE timet = @time and items in (@item)'; 


DECLARE @SQLString nvarchar(500); 
DECLARE @ParmDefinition nvarchar(500); 

SET @ParmDefinition = N'@time timestamp, 
    @item varchar(max) '; 

EXECUTE sp_executesql 
    @SQLString 
    ,@ParmDefinition 
    ,@time = '2010-04-26 17:15:05.667' 
    ,@item = '''Item1'',''Item2'',''Item3'',''Item4''' 
    ; 
4

因爲這是不允許的。

insted的這個,你可以使用動態SQL查詢:

declare @a as varchar; 
set @a='TEST' 
exec ('select ' + @a + ' from x') 
+2

的問題是爲什麼不允許,而不是如何解決它。我無法看到回答「因爲它是不允許的」是非常有幫助的。 – 2010-04-28 07:06:40

+0

@David M:是的,這只是一個解決方法。你的回答是有幫助的 – Alex 2010-04-28 07:14:44

+0

感謝'exec' - 它比'exec sp_executesql'更容易記住等等等等。我記得總是在這個SP中出現錯誤,比如「不允許執行這個程序」。 – 2015-06-12 22:49:10