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?
quelle
Antworten:
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:
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.
quelle