Mi chiedo perché non posso usare il nome colonna della variabile del genere:Nome colonne variabili di SQL Server?
declare @a as varchar;
set @a='TEST'
select @a from x;
si
Mi chiedo perché non posso usare il nome colonna della variabile del genere:Nome colonne variabili di SQL Server?
declare @a as varchar;
set @a='TEST'
select @a from x;
si
Non puoi farlo perché SQL viene compilato prima che sa che cosa il valore di @a è (sto assumendo in realtà si vorrebbe @a essere qualche parametro e non hard coded come nel tuo esempio).
Invece si può fare questo:
declare @a as varchar;
set @a='TEST'
declare @sql nvarchar(max)
set @sql = 'select [' + replace(@a, '''', '''''') + '] from x'
exec sp_executesql @sql
Ma attenzione, questa è una vulnerabilità di sicurezza (attacchi SQL-injection), quindi non dovrebbe essere fatto se non ci si può fidare o ben @a pulito.
ringrazio perché i nomi delle colonne vengono risolti in fase di compilazione, non in fase di esecuzione per l'istruzione SQL.
uso sp_executesql
per questo
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'''
;
Perché non è consentito.
invece di questo si potrebbe usare query SQL dinamico:
declare @a as varchar;
set @a='TEST'
exec ('select ' + @a + ' from x')
La domanda era perché non è permesso, non come aggirarlo. Non riesco a vedere che rispondendo con "Perché non è permesso" è molto utile. –
@David M: sì, questa è solo una soluzione. La tua risposta è utile – Alex
Grazie per 'exec' - è più facile ricordare di exec exec_executesql' blah blah. Ricordo che ricevevo sempre errori con questo SP, come "non è permesso eseguire questa procedura". –
e non utilizzare SQL dinamico a meno di leggere questo primo: http://www.sommarskog.se/dynamic_sql.html – HLGEM