O SQL Server implementou as cláusulas OFFSET
e FETCH
como parte da ORDER BY
cláusula, conforme apontado pelas outras respostas e documentado em sua documentação.
O padrão SQL, por outro lado, possui essas duas cláusulas como independentes:
<query expression> ::=
[ <with clause> ] <query expression body>
[ <order by clause> ] [ <result offset clause> ] [ <fetch first clause> ]
Se alguém quiser que esse recurso seja implementado em total conformidade com o padrão, sempre poderá fazer uma solicitação à equipe do SQL Server, através do canal Connect. De fato, a MS comentou - em uma solicitação diferente sobre deslocamento e busca:
Item de conexão: SQL Denali: adicione o contador de linhas totais à SELECT
instrução - por Alexey Rokhin
Resposta: Postado por Microsoft em 24/11/2010 às 11:34
O requisito que OFFSET/FETCH
requer ORDER BY
é uma restrição nesta liberação. No padrão ANSI SQL (SQL: 2011), onde as novas OFFSET/FETCH
cláusulas são propostas, ORDER BY
é opcional. A restrição no SQL Server está relacionada à limitação em nossa tecnologia de analisador que não pode manipular a sintaxe opcional sem criar OFFSET
uma palavra-chave reservada. Podemos removê-lo no futuro.
Agora com relação a ...
Até então, se alguém quiser usar OFFSET
e FETCH
sem um específico ORDER BY
, uma solução alternativa é adicionar uma ordem "não faça nada" por cláusula. Exemplo:
SELECT
...
ORDER BY (SELECT NULL)
OFFSET 0 ROWS
FETCH NEXT 1 ROWS ONLY;