2010-04-28 20 views

risposta

15

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.

+1

e non utilizzare SQL dinamico a meno di leggere questo primo: http://www.sommarskog.se/dynamic_sql.html – HLGEM

1

ringrazio perché i nomi delle colonne vengono risolti in fase di compilazione, non in fase di esecuzione per l'istruzione SQL.

3

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''' 
    ; 
4

Perché non è consentito.

invece di questo si potrebbe usare query SQL dinamico:

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

La domanda era perché non è permesso, non come aggirarlo. Non riesco a vedere che rispondendo con "Perché non è permesso" è molto utile. –

+0

@David M: sì, questa è solo una soluzione. La tua risposta è utile – Alex

+0

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". –

Problemi correlati