Me pregunto por qué no puedo usar el nombre de columna de la variable así:¿Nombre de columnas variables del servidor SQL?
declare @a as varchar;
set @a='TEST'
select @a from x;
Gracias
Me pregunto por qué no puedo usar el nombre de columna de la variable así:¿Nombre de columnas variables del servidor SQL?
declare @a as varchar;
set @a='TEST'
select @a from x;
Gracias
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.
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.
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'''
;
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')
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. –
@David M: sí, esto es solo una solución. Su respuesta es útil – Alex
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". –
y no utilice SQL dinámico menos que lea esto primero: http://www.sommarskog.se/dynamic_sql.html – HLGEM