2009-09-02 3 views
7

Wir haben zwei Tabellen in unserer Anwendung, die beide eine ShowOrder Spalte haben. Wir verwenden NHibernate in unserer Anwendung und verwenden HQL, verbinden wir diese zwei Tabellen geordnet nach ShowOrder der ersten Tabelle bzw. der zweiten Tabelle.Alias ​​wird ignoriert in OrderBy

Hier ist eine vereinfachte Version meiner Abfrage:

SELECT pr.Id as Id,pr.Title as Title, pr.ShowOrder as ShowOrder 
FROM Process pr 
    INNER JOIN ProcessGroup prg ON pr.GroupId=prg.Id 
ORDER BY prg.ShowOrder,pr.ShowOrder 

Im Allgemeinen unsere Anwendung ohne Probleme arbeiten. Aber wir haben eine alte Anwendung und eine Konvertierungsroutine, um ihre Datenbank in unsere neue Anwendungsdatenbank zu konvertieren.

Immer, wenn wir eine alte Datenbank in unsere neue Datenbank konvertieren, tritt ein Fehler auf, wenn der SQL-Server die obige Abfrage ausführen möchte. Die Ausnahme, sagt:

Eine Spalte mehr als einmal in der Reihenfolge Liste

Wenn wir pr.ShowOrder wählen angegeben wurde ohne Alias ​​alles in Ordnung ist.

Es scheint, dass wenn ein Alias ​​ShowOrder in der Auswahlliste vorhanden ist, SQL Server Tabellenaliase ignoriert und davon ausgeht, dass pr.ShowOrder und prg.ShowOrder identisch sind.

Antwort

12

Dies ist das Standardverhalten von ANSI SQL und wurde von SQL Server ab der Version 2005 angenommen.

ORDER BY operiert NICHT mit den Spaltenwerten aus den Quellentabellen (FROM-Klausel), sondern operiert technisch NUR mit der Ausgabe Spaltenwerte in der SELECT-Klausel (**). Wenn Sie also "ShowOrder" in der ORDER BY-Klausel angeben, verwendet es tatsächlich den ShowOrder-Wert in der Ausgabeliste (was zufällig pr.ShowOrder ist). Wenn Sie beide ShowOrders verwenden möchten, sollten Sie beide in die SELECT-Klausel mit anderen Namen einfügen.

Der Grund, dass, wenn Sie die Tabellenaliasnamen Quelle verwendet nicht bellen ist (was es sollte technisch) mit SQL Server für die Kompatibilität 2000 ist, aber das ist eine gefährliche Kompatibilität. Egal, welchen Aliasnamen Sie in ORDER BY verwenden, es wird nur der Name verwendet, der in der Ausgabeliste angezeigt wird.

(** - und ja, es gibt Möglichkeiten, aber sie sind da, um einige Kompatibilität mit früheren Versionen zu bieten. Sie sind besser dran, nur mit dem Standard gehen).

2

Ein weiterer Grund für diesen Fehler könnte sein - der Datenbankkompatibilitätsgrad ist auf "2000-mode" festgelegt (dies kann passieren, nachdem Sie Ihren SQL Server von 2000 auf 2005 oder höher aktualisiert haben).

Lösung:

"SQL Management Studio" - Rechtsklick auf die Datenbank - "Eigenschaften" - "Optionen" - "Kompatibilitätsgrad" - auf 90 oder höher.

+0

Ich tat tatsächlich das Gleiche – Beatles1692