Lỗi máy chủ SQL, sử dụng tùy chọn không hợp lệ FIRST trong câu lệnh FETCH.


8

Từ năm 2012 trở đi, các tài liệu SQL Server cho thấy họ hỗ trợ OFFSET..FETCHmà tôi đang cố gắng sử dụng thay vì a LIMIT.

Phần sau hoạt động tốt trong PostgreSQL để lấy mẫu tập kết quả,

SELECT *
FROM ( VALUES (1),(2),(3) ) AS t(x)
OFFSET 0 ROWS
FETCH NEXT 1 ROWS ONLY;

Tuy nhiên, với SQL Server, tôi nhận được

Msg 153, Level 15, State 2, Line 4
Invalid usage of the option FIRST in the FETCH statement.

Những gì đang xảy ra ở đây? SQL Server có hỗ trợ chuẩn hóa không OFFSET.. FETCH?

Câu trả lời:


17

SQL Server đã triển khai các mệnh đề OFFSETFETCHmột phần của ORDER BYmệnh đề, như được chỉ ra bởi các câu trả lời khác và được ghi lại trong tài liệu của họ.

Mặt khác, tiêu chuẩn SQL có cả hai mệnh đề này là độc lập:

<query expression> ::=
[ <with clause> ] <query expression body>
[ <order by clause> ] [ <result offset clause> ] [ <fetch first clause> ]

Nếu ai đó muốn tính năng này được triển khai tuân thủ đầy đủ với tiêu chuẩn, họ luôn có thể yêu cầu nhóm SQL Server, thông qua kênh Connect. Trong thực tế, MS đã nhận xét - trong một yêu cầu khác về offset và tìm nạp:

Kết nối mục: SQL Denali: thêm tổng số bộ đếm vào SELECTcâu lệnh - bởi Alexey Rokhin

Trả lời: Được đăng bởi Microsoft vào ngày 24/11/2010 lúc 11:34

Yêu cầu đó OFFSET/FETCHđòi hỏi ORDER BYlà một hạn chế trong phiên bản này. Trong tiêu chuẩn SQL ANSI (SQL: 2011) trong đó các OFFSET/FETCHmệnh đề mới được đề xuất, ORDER BYlà tùy chọn. Hạn chế trong SQL Server phải thực hiện với giới hạn trong công nghệ trình phân tích cú pháp của chúng tôi không thể xử lý cú pháp tùy chọn mà không tạo OFFSETtừ khóa dành riêng. Chúng tôi có thể loại bỏ nó trong tương lai.

Bây giờ đối với ...

Cho đến lúc đó, nếu một người muốn sử dụng OFFSETFETCHkhông có một cụ thể ORDER BY, một cách giải quyết là thêm một thứ tự "không làm gì" theo mệnh đề. Thí dụ:

SELECT 
...
ORDER BY (SELECT NULL)
OFFSET 0 ROWS
FETCH NEXT 1 ROWS ONLY;

10

Như đã nêu ở trên cùng của tài liệu về OFFSET..FETCH

Mệnh đề OFFSET-FETCH cung cấp cho bạn một tùy chọn để chỉ tìm nạp một cửa sổ hoặc trang kết quả từ tập kết quả. OFFSET-FETCH chỉ có thể được sử dụng với mệnh đề ORDER BY.

...

ORDER BY là bắt buộc để sử dụng mệnh đề OFFSET và FETCH.

Vì thế,

SELECT *
FROM ( VALUES (1),(2),(3) ) AS t(x)
ORDER BY t.[x]  /* <-- ADD ME TO BE HAPPY */
OFFSET 0 ROWS
FETCH NEXT 1 ROWS ONLY;

Không đơn giản cho việc đơn giản LIMITnếu đó là những gì bạn sẽ làm TOP.


9

Theo tài liệu tham khảo , OFFSETmệnh đề này là một phần của ORDER BYSQL Server. Bạn cũng cần thêm ROWStừ khóa sau OFFSETthông số kỹ thuật:

SELECT *
FROM ( VALUES (1),(2),(3) ) AS t(x)
ORDER BY x
OFFSET 0 ROWS
FETCH FIRST 1 ROWS ONLY;
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.