我想知道为什么我不能像这样使用变量列名:
declare @a as varchar;
set @a='TEST'
select @a from x;
谢谢
答案 0 :(得分:15)
你不能这样做,因为SQL在它知道@a的值之前是编译的(我假设你实际上你希望@a是一些参数而不像你的例子那样硬编码)。 / p>
相反,你可以这样做:
declare @a as varchar;
set @a='TEST'
declare @sql nvarchar(max)
set @sql = 'select [' + replace(@a, '''', '''''') + '] from x'
exec sp_executesql @sql
但要小心,这是一个安全漏洞(sql-injection攻击),所以如果你不能信任或干净@a,就不应该这样做。
答案 1 :(得分:4)
因为它是不允许的。而不是这个你可以使用动态SQL查询:
declare @a as varchar;
set @a='TEST'
exec ('select ' + @a + ' from x')
答案 2 :(得分:3)
将<{1}}用于此
sp_executesql
答案 3 :(得分:2)
因为列名在编译时解析而不是在SQL语句的运行时解析。