2010-04-28 4 views

Antwort

15

Sie es nicht tun, weil SQL kompiliert wird, bevor er weiß, was der Wert von @a ist (ich bin in Wirklichkeit vorausgesetzt, Sie wollen @a einige sein Parameter und nicht wie in Ihrem Beispiel fest codiert).

Stattdessen können Sie dies tun:

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

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

exec sp_executesql @sql 

Aber Vorsicht, dies ist eine Sicherheitslücke (SQL-Injection-Angriffe), so sollte nicht erfolgen, wenn Sie nicht oder gut sauber @a vertrauen können.

+1

Und verwenden Sie keine dynamische SQL, wenn Sie diese zuerst lesen: http://www.sommarskog.se/dynamic_sql.html – HLGEM

1

Da die Spaltennamen aufgelöst werden bei der Kompilierung zur Laufzeit nicht für die SQL-Anweisung.

3

Verwendung sp_executesql für dieses

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

Weil es nicht erlaubt ist.

Insted hierfür könnte Sie dynamische SQL-Abfrage verwenden:

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

Die Frage war, Warum ist es nicht erlaubt, nicht wie man es umgeht. Ich kann nicht sehen, dass die Antwort mit "Weil es nicht erlaubt ist" sehr hilfreich ist. –

+0

@ David M: Ja, das ist nur ein Workaround. Ihre Antwort ist gut! – Alex

+0

Danke für 'exec' - es ist leichter zu erinnern als' exec sp_executesql' bla bla. Ich erinnere mich immer Fehler mit diesem SP zu bekommen, wie "nicht erlaubt, dieses Verfahren auszuführen". –