Имя столбца переменной SQL Server? - PullRequest
18 голосов
/ 28 апреля 2010

Мне интересно, почему я не могу использовать имя столбца переменной следующим образом:

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

select @a from x;

Спасибо

Ответы [ 4 ]

15 голосов
/ 28 апреля 2010

Вы не можете сделать это, потому что 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

Но будьте осторожны, это уязвимость системы безопасности (атаки с использованием sql-инъекций), поэтому ее не следует делать, если вы не можете доверять или хорошо чиститесь @ a.

4 голосов
/ 28 апреля 2010

Потому что это не разрешено.

С этого момента вы можете использовать динамический SQL-запрос:

declare @a as varchar;
set @a='TEST'
exec ('select ' + @a + ' from x')
3 голосов
/ 28 апреля 2010

используйте 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'''
    ;
2 голосов
/ 28 апреля 2010

Поскольку имена столбцов разрешаются во время компиляции, а не во время выполнения для оператора SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...