Ошибка SQL Server, «Неправильное использование параметра FIRST в операторе FETCH».


8

Начиная с 2012 года документы по SQL Server показывают, что они поддерживают то, OFFSET..FETCHчто я пытаюсь использовать вместо LIMIT.

Следующее прекрасно работает в PostgreSQL для выборки набора результатов,

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

Тем не менее, с SQL Server, я получаю

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

Что тут происходит? SQL Server поддерживает стандартизированный OFFSET.. FETCH?

Ответы:


17

SQL Server была реализована OFFSETи FETCHположения в рамках ORDER BYпункта, как указано на другие ответы и задокументированы в их документации.

Стандарт SQL, с другой стороны, имеет оба этих пункта как независимые:

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

Если кто-то хочет, чтобы эта функция была реализована в полном соответствии со стандартом, он всегда может сделать запрос в группу SQL Server через канал Connect. Фактически, MS прокомментировала - в другом запросе о смещении и выборке:

Подключить элемент: SQL Denali: добавить счетчик строк в SELECTоператор - Алексей Рохин

Ответ: Опубликовано Microsoft 24/11/2010 в 11:34

Требование, которое OFFSET/FETCHтребует, ORDER BYявляется ограничением в этом выпуске. В стандарте ANSI SQL (SQL: 2011), где предлагаются новые OFFSET/FETCHпредложения, ORDER BYнеобязательно. Ограничение в SQL Server связано с ограничением в нашей технологии синтаксического анализа, которая не может обрабатывать необязательный синтаксис без создания OFFSETзарезервированного ключевого слова. Мы можем удалить это в будущем.

Теперь что касается ...

До тех пор, если кто-то хочет использовать OFFSETи FETCHбез конкретного ORDER BY, обходной путь должен добавить порядок «ничего не делать» по предложению. Пример:

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

10

Как указано в самом верху документации по OFFSET..FETCH

Предложение OFFSET-FETCH предоставляет вам возможность выбрать только окно или страницу результатов из набора результатов. OFFSET-FETCH может использоваться только с предложением ORDER BY.

...

ORDER BY является обязательным для использования предложений OFFSET и FETCH.

Так,

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;

Не все так просто для простого, LIMITесли это то, что вы собираетесь, вы хотите придерживаться TOP.


9

Согласно ссылке , OFFSETпредложение является частью ORDER BYSQL Server. Вам также необходимо добавить ROWSключевое слово после OFFSETспецификации:

SELECT *
FROM ( VALUES (1),(2),(3) ) AS t(x)
ORDER BY x
OFFSET 0 ROWS
FETCH FIRST 1 ROWS ONLY;
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.