Мне интересно, почему я не могу использовать имя столбца переменной вроде этого:
declare @a as varchar;
set @a='TEST'
select @a from x;
Спасибо
Ответ 1
Вы не можете этого сделать, потому что 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-injection), поэтому не следует делать, если вы не можете доверять или хорошо очищать @a.
Ответ 2
Потому что это не разрешено.
При этом вы можете использовать динамический SQL-запрос:
declare @a as varchar;
set @a='TEST'
exec ('select ' + @a + ' from x')
Ответ 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
Поскольку имена столбцов разрешены во время компиляции не во время выполнения для оператора SQL.