none
Mit Parameter sortieren? RRS feed

  • Frage

  • Hi, ich möchte gerne folgende gespeicherte Prozedur ausführen bekomme aber immer einen Fehler

     

    DECLARE @sortieren VARCHAR(200)
    
    ..
    
    ..
    
    ORDER BY @sortieren
    
    

    Meldung 1008, Ebene 16, Status 1, Prozedur Get_xx_Status, Zeile 38

    Das von der ORDER BY-Nummer 1 identifizierte SELECT-Element enthlt eine Variable in dem Ausdruck, der eine Spaltenposition identifiziert. Variablen sind nur zulssig, wenn der Ausdruck in der ORDER BY-Klausel auf einen Spaltennamen verweist.

    Könnt ihr mir da weiterhelfen?

    Montag, 6. Dezember 2010 14:09

Antworten

  • Hallo Michael,

    das ist so einfach leider nicht möglich, da - wie Du ja bereits gemerkt hast, Variablen im ORDER BY nicht gültig sind. Das hängt schlicht und einfach damit zusammen, wie SQL Server eine Abfrage "abarbeitet".

    Die einzige Möglichkeit, die mir hier einfallen würde, wäre dynamisches SQL. Ich bin zwar kein Freund davon aber wenn es unbedingt sein muss, bleibt dies die einzige Wahl.

    Hier mal ein Codebeispiel, wie ich es verwenden würde...

    DECLARE	@stmt	      nvarchar(1000)
    DECLARE	@OrderColumn    nvarchar(200)
    DECLARE	@ColumnPos     int
    SET	@OrderColumn = 'Strasse'
    
    -- An der wievielten Stelle ist das Attribut in der Auswahl
    SELECT	@ColumnPos = colid
    FROM	sys.syscolumns
    WHERE	id = OBJECT_ID('data.tbl_app_Stammdaten', 'U') AND
    	name = @OrderColumn
    
    -- Definition des SQL String
    SET	@stmt	=	'SELECT * FROM data.tbl_app_Stammdaten WHERE Category = ''EF'' ORDER BY @Id'
    SET	@stmt	=	REPLACE(@stmt, '@Id', @ColumnPos)
    EXEC sp_executeSQL @stmt
    
    

    Mehr Informationen zur Verwendung von sp_executeSQL findest Du z. B. hier:

    http://msdn.microsoft.com/de-de/library/ms188001.aspx


    Uwe Ricken
    Microsoft Certified Database Administrator SQL Server 2005
    db Berater GmbH
    http://www-db-berater.de
    Montag, 6. Dezember 2010 14:44
  • Hallo Michael,

    die ORDER BY Klausel erlaubt keine Variablen für die Spaltenangabe.

    Neben dem von Uwe vorgeschlagenen dynamischen SQL,  wäre eine Alternative,
    die Sortierung über eine CASE Ausdruck durchzuführen. Fiktiv:

    SELECT * FROM Tabelle
    ORDER BY CASE @sortieren 
      WHEN 'Spalte1' THEN Spalte1
      WHEN 'Spalte2' THEN Spalte2
      ELSE 'Spalte3' END;
    

    Ein weiteres Beispiel und mehr zu dynamischem SQL, siehe
    http://www.sommarskog.se/dynamic_sql.html#Order_by

    Gruß Elmar

     

    Montag, 6. Dezember 2010 20:22
    Beantworter

Alle Antworten

  • Hallo Michael,

    das ist so einfach leider nicht möglich, da - wie Du ja bereits gemerkt hast, Variablen im ORDER BY nicht gültig sind. Das hängt schlicht und einfach damit zusammen, wie SQL Server eine Abfrage "abarbeitet".

    Die einzige Möglichkeit, die mir hier einfallen würde, wäre dynamisches SQL. Ich bin zwar kein Freund davon aber wenn es unbedingt sein muss, bleibt dies die einzige Wahl.

    Hier mal ein Codebeispiel, wie ich es verwenden würde...

    DECLARE	@stmt	      nvarchar(1000)
    DECLARE	@OrderColumn    nvarchar(200)
    DECLARE	@ColumnPos     int
    SET	@OrderColumn = 'Strasse'
    
    -- An der wievielten Stelle ist das Attribut in der Auswahl
    SELECT	@ColumnPos = colid
    FROM	sys.syscolumns
    WHERE	id = OBJECT_ID('data.tbl_app_Stammdaten', 'U') AND
    	name = @OrderColumn
    
    -- Definition des SQL String
    SET	@stmt	=	'SELECT * FROM data.tbl_app_Stammdaten WHERE Category = ''EF'' ORDER BY @Id'
    SET	@stmt	=	REPLACE(@stmt, '@Id', @ColumnPos)
    EXEC sp_executeSQL @stmt
    
    

    Mehr Informationen zur Verwendung von sp_executeSQL findest Du z. B. hier:

    http://msdn.microsoft.com/de-de/library/ms188001.aspx


    Uwe Ricken
    Microsoft Certified Database Administrator SQL Server 2005
    db Berater GmbH
    http://www-db-berater.de
    Montag, 6. Dezember 2010 14:44
  • Hallo Michael,

    die ORDER BY Klausel erlaubt keine Variablen für die Spaltenangabe.

    Neben dem von Uwe vorgeschlagenen dynamischen SQL,  wäre eine Alternative,
    die Sortierung über eine CASE Ausdruck durchzuführen. Fiktiv:

    SELECT * FROM Tabelle
    ORDER BY CASE @sortieren 
      WHEN 'Spalte1' THEN Spalte1
      WHEN 'Spalte2' THEN Spalte2
      ELSE 'Spalte3' END;
    

    Ein weiteres Beispiel und mehr zu dynamischem SQL, siehe
    http://www.sommarskog.se/dynamic_sql.html#Order_by

    Gruß Elmar

     

    Montag, 6. Dezember 2010 20:22
    Beantworter