Reihenfolge nach Fehler in SQL Server 2005 vs SQL Server 2012

7

Ich habe eine vom Entity Framework generierte Abfrage, die falsche Ergebnisse in einer SQL Server 2005-Datenbank (Microsoft SQL Server 2005 - 9.00.5000.00 (X64)) zurückgibt, aber in SQL Server 2012 (Microsoft SQL Server 2012 - 11.0.2100.60) gut ist.

Hier ist die Abfrage:

SELECT 
[Project2].[tableAid] AS [id],     
[Project2].[rank1] AS [rank]   
FROM ( SELECT 
    [Extent1].[id] AS [id], 
    [Extent2].[rank] AS [rank],        
    [Extent4].[rank] AS [rank1]      
    FROM    [dbo].[tableA] AS [Extent1]
    LEFT OUTER JOIN [dbo].[tableB] AS [Extent2] ON ([Extent1].[tableAid] = [Extent2].[tableAid]) AND (896 = [Extent2].[tableBid])
    INNER JOIN [dbo].[tableC] AS [Extent4] ON [Extent1].[tableCid] = [Extent4].[tableCid]        
)  AS [Project2]
ORDER BY [Project2].[rank] DESC

Ich habe es vereinfacht, aber das Modell ist:

TableA
int tableAid
int tableCid

tableB
int tableBid
int tableAid
int rank

tableC
int tableCid
int rank

Es gibt eine viele zu viele Beziehung zwischen A und B und eine 1 zu 1 zwischen A und C.

Unter SQL Server 2005 wird diese Abfrage nach der Rangspalte der Ergebnisse sortiert, nicht nach Project2.rank. Wenn ich [Projekt2]. [Rang1] AS [Rang] in SELECT durch [Projekt2]. [Rang1] AS [was auch immer] ersetze, werden die Ergebnisse korrekt sortiert. Da diese Aliase jedoch von EF generiert werden, kann ich sie nicht einfach ändern. Unter SQL Server 2012 funktioniert die Abfrage unverändert.

Kennt jemand diesen Fehler? Gibt es einen Patch oder einige Einstellungen für SQL Server 2005, um dieses Problem zu vermeiden?

Dawmz
quelle
Ist der Kompatibilitätsmodus der Datenbank zufällig auf 80 (SQL Server 2000) eingestellt? Das würde das unterschiedliche Verhalten erklären.
Ypercubeᵀᴹ

Antworten:

13

Wenn Sie mit einer Kompatibilitätsstufe von 80 (SQL-Server 2000) arbeiten, ist dies das erwartete Verhalten. Es wurde in Version 2005 korrigiert.

Sie können die Seite Kompatibilitätsstufen bei MSDN überprüfen, auf der die Unterschiede aufgeführt sind. Im Abschnitt "Unterschiede zwischen niedrigeren Kompatibilitätsstufen und Stufe 90" ist einer der vielen Punkte:

Beim Binden der Spaltenreferenzen in der ORDER BYListe an die in der SELECTListe definierten Spalten werden Spaltenmehrdeutigkeiten und Spaltenpräfixe manchmal ignoriert. Dies kann dazu führen, dass die Ergebnismenge in einer unerwarteten Reihenfolge zurückgegeben wird.

Beispielsweise wird eine ORDER BYKlausel mit einer einzelnen zweiteiligen Spalte (.) SELECTAkzeptiert, die als Referenz auf eine Spalte in einer Liste verwendet wird, der Tabellenalias wird jedoch ignoriert. Betrachten Sie die folgende Abfrage.

SELECT c1 = -c1 FROM t_table AS x ORDER BY x.c1

Bei der Ausführung wird das Spaltenpräfix in der ignoriert ORDER BY. Die Sortieroperation wird in der angegebenen Quellenspalte (x.c1) nicht wie erwartet ausgeführt. Stattdessen tritt es in der abgeleiteten c1-Spalte auf, die in der Abfrage definiert ist. Der Ausführungsplan für diese Abfrage zeigt, dass zuerst die Werte für die abgeleitete Spalte berechnet und dann die berechneten Werte sortiert werden.

Welches ist genau das, was Sie beschreiben.

Die einfachste Problemumgehung besteht darin, nicht denselben Alias ​​für eine Spalte in der Unterabfrage und für eine andere in der Hauptabfrage zu verwenden.

ypercubeᵀᴹ
quelle
2
+1 schön, muss das hier
Aaron Bertrand
2
Sie haben Recht, mein SQL 2005 ist auf Kompatibilitätsstufe 80 eingestellt! Gut zu wissen. Vielen Dank !
Dawmz