Я задаюсь вопросом, почему я не могу использовать имя переменной столбца так:Имя столбца переменной SQL Server?
declare @a as varchar;
set @a='TEST'
select @a from x;
Спасибо
Я задаюсь вопросом, почему я не могу использовать имя переменной столбца так:Имя столбца переменной SQL Server?
declare @a as varchar;
set @a='TEST'
select @a from x;
Спасибо
Вы не можете это сделать, потому что 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.
Поскольку имена столбцов во время компиляции не во время выполнения для оператора SQL.
использование 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'''
;
Потому что это запрещено.
Insted этого вы можете использовать динамический SQL-запрос:
declare @a as varchar;
set @a='TEST'
exec ('select ' + @a + ' from x')
Вопрос был почему это не разрешено, а не как обойти это. Я не вижу, что ответ с «Потому что это не разрешено» очень полезно. –
@ Давид М: да, это только обходное решение. Ваш ответ полезен – Alex
Спасибо за 'exec' - его легче запомнить, чем' exec sp_executesql' blah blah. Я помню, что всегда получал ошибки с этим SP, например «не разрешено выполнять эту процедуру». –
не использовать динамический SQL, если вы читаете это первая: http://www.sommarskog.se/dynamic_sql.html – HLGEM