Sắp xếp theo lỗi trên SQL Server 2005 so với SQL Server 2012


7

Tôi có một truy vấn được tạo bởi khung thực thể trả về kết quả sai trên cơ sở dữ liệu SQL Server 2005 (Microsoft SQL Server 2005 - 9.00.5000.00 (X64)) nhưng tốt trên SQL Server 2012 (Microsoft SQL Server 2012 - 11.0.2100.60).

Đây là truy vấn:

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

Tôi đã đơn giản hóa nó nhưng mô hình là:

TableA
int tableAid
int tableCid

tableB
int tableBid
int tableAid
int rank

tableC
int tableCid
int rank

Có rất nhiều mối quan hệ giữa A và B và 1 đến 1 giữa A và C.

Trên SQL Server 2005, truy vấn này được sắp xếp theo cột thứ hạng của kết quả, không phải bởi Project2.rank. Nếu tôi thay thế [Project2]. [Rank1] AS [rank] trong CHỌN bởi [Project2]. [Rank1] AS [sao], kết quả được sắp xếp chính xác. Nhưng vì các bí danh này được tạo bởi EF, tôi không thể dễ dàng thay đổi chúng. Trên SQL Server 2012, truy vấn hoạt động chính xác.

Có ai biết lỗi này không? Có một bản vá hoặc một số cài đặt cho SQL Server 2005 để tránh vấn đề này không?


Có phải chế độ tương thích của cơ sở dữ liệu được đặt thành 80 (sql-server 2000) không? Điều đó sẽ giải thích các hành vi khác nhau.
ypercubeᵀᴹ

Câu trả lời:


13

Nếu bạn đang chạy ở mức tương thích 80 (SQL-Server 2000), thì đây là hành vi được mong đợi. Nó đã được sửa trong phiên bản 2005.

Bạn có thể kiểm tra trang Mức độ tương thích tại MSDN nơi có sự khác biệt được liệt kê. Trong phần "Sự khác biệt giữa các mức tương thích thấp hơn và cấp 90" , một trong nhiều mục là:

Khi liên kết các tham chiếu cột trong ORDER BYdanh sách với các cột được xác định trong SELECTdanh sách, sự mơ hồ của cột bị bỏ qua và tiền tố cột đôi khi bị bỏ qua. Điều này có thể khiến kết quả được đặt trở lại theo thứ tự không mong muốn.

Ví dụ: một ORDER BYmệnh đề có một cột hai phần (.) Được sử dụng làm tham chiếu đến một cột trong SELECTdanh sách được chấp nhận, nhưng bí danh bảng bị bỏ qua. Hãy xem xét các truy vấn sau đây.

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

Khi được thực thi, tiền tố cột bị bỏ qua trong ORDER BY. Hoạt động sắp xếp không xảy ra trên cột nguồn được chỉ định (x.c1) như mong đợi; thay vào đó, nó xuất hiện trên cột c1 dẫn xuất được xác định trong truy vấn. Kế hoạch thực hiện cho truy vấn này cho thấy rằng các giá trị cho cột dẫn xuất được tính toán trước và sau đó các giá trị được tính toán được sắp xếp.

đó chính xác là những gì bạn mô tả.

Cách giải quyết đơn giản nhất là không sử dụng cùng một bí danh cho một cột trong truy vấn con và cho một cột khác trong truy vấn chính.


2
+1 đẹp, cần thêm vào đây
Aaron Bertrand

2
Bạn nói đúng, sql 2005 của tôi được đặt ở mức tương thích 80! Rất vui được biết. Cảm ơn !
Dawmz
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.