2010-04-28 39 views

Respuesta

15

No puede hacerlo porque SQL se compila antes de que sabe lo que el valor de @a es (estoy suponiendo que en realidad le gustaría que @ un ser algún parámetro y no codificado como en su ejemplo).

su lugar se puede hacer esto:

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

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

exec sp_executesql @sql 

Pero tenga cuidado, se trata de una vulnerabilidad de seguridad (ataques de inyección SQL) por lo que no debe hacerse si no se puede confiar o bien @ un limpia.

+1

y no utilice SQL dinámico menos que lea esto primero: http://www.sommarskog.se/dynamic_sql.html – HLGEM

1

Debido a que los nombres de columna se resuelven en tiempo de compilación, no en tiempo de ejecución para la instrucción SQL.

3

uso sp_executesql para este

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

Porque no está permitido.

Insted de esta consulta se puede utilizar SQL dinámico:

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

La pregunta era por qué no está permitido, no cómo evitarlo. No puedo ver que contestar con "Porque no está permitido" es muy útil. –

+0

@David M: sí, esto es solo una solución. Su respuesta es útil – Alex

+0

Gracias por 'ejecutivo' - es más fácil de recordar que 'exec sp_executesql' blah blah. Recuerdo que siempre obtuve errores con este SP, como "no se permite ejecutar este procedimiento". –

Cuestiones relacionadas