2010-04-28 215 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