SQL Server 2005: Select-Abfrage mit Spaltenalias bzw. Spaltenname mit Leerzeichen funktioniert nicht



  • Hallo Forum

    ich habe folgende Abfrage:

    SELECT     [IB reference], [ID card reference], [SY reference], [Mean reference] AS mr
    FROM         ImportantMeansList
    WHERE     (mr = @mr)
    

    Leider funktioniert das so nicht, da ich folgende Fehlermeldung erhalte:

    unknown columnname "mr".
    

    Wenn ich das ganze so versuche:

    SELECT     [IB reference], [ID card reference], [SY reference], [Mean reference] AS mr
    FROM         ImportantMeansList
    WHERE     ([Mean reference] = @[Mean reference])
    

    Funktioniert es auch nicht, dann bekomme ich diese Fehlermeldung:

    Must declare the scalar variable "@".
    

    Hängt das damit zusammen dass mein Spaltenname zusammengesetzt ist mit Leerzeichen? Wenn ja, wie kann ich den Fehler umgehen? Das muss ja auch mit solchen Spaltennamen funktionieren. Muss ich das @ irgendwie in Anführungszeichen oder sowas setzen? Hab im Internet dazu leider nichts gefunden.

    Danke für eure Hilfe!



  • Wer Leerzeichen, Sonderzeichen, oder gar reservierte Wörter für Spaltennamen verwendet hat selber schuld... 😉

    Was soll denn mr sein? Mit eiem @ greifst Du auf lokale Variablen zu. Diese müssen aber deklariert und zugewiesen werden. Wenn es ein Parameter sein soll, muss das mit einem : beginnen.

    Also:

    SELECT     [IB reference], [ID card reference], [SY reference], [Mean reference] AS mr
    FROM         ImportantMeansList
    WHERE     ([Mean reference] = :mr)  // ich weiß nicht, ob das Alias beim MS SQL Server funktioniert, musst Du ausprobieren.
    


  • Danke für die Hilfe. Hab meine Spaltennamen nun ohne Leerzeichen benannt und hab keine Probleme mehr. Wieder was gelernt :-).



  • Das Problem ist nicht irgendwas mit Leerzeichen o.ä., das Problem ist generell dass du versuchst IN der eigentlichen Abfrage Spalten-Aliase zu verwenden. Das geht nämlich nicht.

    Du kannst aber ein sub-select verwenden:

    BEGIN TRAN;
    
    CREATE TABLE #test (
    	[a column] INT NOT NULL PRIMARY KEY,
    	[another column] INT NOT NULL,
    	[yet another column] INT NOT NULL
    	);
    
    INSERT #test ([a column], [another column], [yet another column]) VALUES (1, 2, 3);
    INSERT #test ([a column], [another column], [yet another column]) VALUES (2, 5, 5);
    INSERT #test ([a column], [another column], [yet another column]) VALUES (3, 6, 6);
    INSERT #test ([a column], [another column], [yet another column]) VALUES (4, 7, 7);
    
    -- geht nicht:
    /*
    SELECT
    	[a column] as c1,
    	[another column] as c2,
    	[yet another column] AS c3
    FROM
    	#test
    WHERE
    	c1 > 1     --  <-- hier kannst du zwar tabellen-aliase verwenden, aber keine spalten-aliase!
    	AND c2 < 7 --  <-- ...
    ORDER BY
    	c2 DESC    --  <-- ebenso
    	;
    */
    
    -- geht:
    SELECT
    	*
    FROM (
    	SELECT
    		[a column] as c1,
    		[another column] as c2,
    		[yet another column] AS c3
    	FROM
    		#test
    	) AS t
    WHERE
    	c1 > 1
    	AND c2 < 7
    ORDER BY
    	c2 DESC
    	;
    
    DROP TABLE #test;
    
    ROLLBACK TRAN;
    

Anmelden zum Antworten