Ich frage mich, warum ich nicht variable Spaltennamen wie das verwenden:Name der SQL Server-Variablenspalten?
declare @a as varchar;
set @a='TEST'
select @a from x;
Danke
Ich frage mich, warum ich nicht variable Spaltennamen wie das verwenden:Name der SQL Server-Variablenspalten?
declare @a as varchar;
set @a='TEST'
select @a from x;
Danke
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.
Da die Spaltennamen aufgelöst werden bei der Kompilierung zur Laufzeit nicht für die SQL-Anweisung.
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'''
;
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')
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. –
@ David M: Ja, das ist nur ein Workaround. Ihre Antwort ist gut! – Alex
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". –
Und verwenden Sie keine dynamische SQL, wenn Sie diese zuerst lesen: http://www.sommarskog.se/dynamic_sql.html – HLGEM