SQL Server变量列名?

Pet*_*etr 18 t-sql sql-server

我想知道为什么我不能像这样使用变量列名:

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

select @a from x;
Run Code Online (Sandbox Code Playgroud)

谢谢

Dan*_*haw 15

你无法做到这一点,因为SQL在知道@a的值之前是编译的(我假设你实际上想要@a是一些参数而不像你的例子那样硬编码).

相反,你可以这样做:

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

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

exec sp_executesql @sql
Run Code Online (Sandbox Code Playgroud)

但是要小心,这是一个安全漏洞(sql-injection攻击),所以如果你不能信任或者干净@a,就不应该这样做.

  • 除非您先阅读以下内容,否则不要使用动态 SQL:http://www.sommarskog.se/dynamic_sql.html (2认同)

Ale*_*lex 5

因为这是不允许的。

您可以使用动态 sql 查询:

declare @a as varchar;
set @a='TEST'
exec ('select ' + @a + ' from x')
Run Code Online (Sandbox Code Playgroud)

  • 问题是为什么不允许这样做,而不是如何解决它。我看不出回答“因为这是不允许的”有什么帮助。 (4认同)