Wir haben zwei Tabellen in unserer Anwendung, die beide eine Spalte ShowOrder
haben. Wir verwenden NHibernate in unserer Anwendung und verwenden HQL, verbinden wir diese beiden Tabellen nach ShowOrder
der ersten Tabelle bzw. der zweiten Tabelle.
Hier ist eine vereinfachte Version meiner Abfrage:
%Vor%Im Allgemeinen funktioniert unsere Anwendung ohne Probleme. Aber wir haben eine alte Anwendung und eine Konvertierungsroutine, um ihre Datenbank in unsere neue Anwendungsdatenbank zu konvertieren.
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 wurde mehrmals in der Reihenfolge nach Liste
angegeben
Wenn wir pr.ShowOrder
ohne Alias auswählen, ist alles in Ordnung.
Wenn in der Auswahlliste ein ShowOrder
Alias vorhanden ist, ignoriert SQL Server Tabellenaliase und nimmt an, dass pr.ShowOrder
und prg.ShowOrder
identisch sind.
Dies ist das Standardverhalten von ANSI SQL und wurde von SQL Server ab Version 2005 übernommen.
ORDER BY operiert NICHT mit den Spaltenwerten aus den Quellentabellen (FROM-Klausel), sondern arbeitet technisch NUR mit den Spaltenwerten output 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 ShowOrder verwenden möchten, sollten Sie beide in die SELECT-Klausel mit anderen Namen einfügen.
Der Grund dafür, dass Sie bei der Verwendung der quellen -Tabellenaliasnamen nicht bellen (was technisch eigentlich sein sollte), ist die Kompatibilität mit SQL Server 2000, 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 Kompatibilität mit früheren Versionen zu gewährleisten. Du gehst besser mit dem Standard).
Ein anderer Grund für diesen Fehler könnte sein - die Datenbankkompatibilitätsstufe ist auf " 2000-mode " eingestellt (dies kann passieren, nachdem Sie Ihren SQL Server von 2000 auf 2005 oder höher aktualisiert haben).
Lösung:
"SQL Management Studio" - klicken Sie mit der rechten Maustaste auf die Datenbank - "Eigenschaften" - "Optionen" - "Kompatibilitätsgrad" - auf 90 oder höher gesetzt.
Tags und Links sql-server sql-order-by alias