2010-04-28 21 views

ответ

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 

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

+1

не использовать динамический SQL, если вы читаете это первая: http://www.sommarskog.se/dynamic_sql.html – HLGEM

1

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

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

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

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

declare @a as varchar; 
set @a='TEST' 
exec ('select ' + @a + ' from x') 
+2

Вопрос был почему это не разрешено, а не как обойти это. Я не вижу, что ответ с «Потому что это не разрешено» очень полезно. –

+0

@ Давид М: да, это только обходное решение. Ваш ответ полезен – Alex

+0

Спасибо за 'exec' - его легче запомнить, чем' exec sp_executesql' blah blah. Я помню, что всегда получал ошибки с этим SP, например «не разрешено выполнять эту процедуру». –

Смежные вопросы