Alias ​​wird in OrderBy ignoriert

7

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.

    
Beatles1692 02.09.2009, 11:30
quelle

3 Antworten

10

Dies ist eine Änderung im Verhalten zwischen SQL Server 2000 und SQL Server 2005

Ссылка

    
MartW 02.09.2009, 11:37
quelle
12

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).

    
RBarryYoung 02.09.2009 11:37
quelle
2

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.

    
Alex 04.02.2011 09:53
quelle

Tags und Links