Erro do SQL Server, “Uso inválido da opção PRIMEIRO na instrução FETCH”.


8

A partir de 2012, os documentos do SQL Server mostram que eles suportam o OFFSET..FETCHque estou tentando usar em vez de a LIMIT.

O seguinte funciona bem no PostgreSQL para provar um conjunto de resultados,

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

No entanto, com o SQL Server, recebo

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

O que está acontecendo aqui? O SQL Server suporta os padrões OFFSET.. FETCH?

Respostas:


17

O SQL Server implementou as cláusulas OFFSETe FETCHcomo parte da ORDER BYclá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 à SELECTinstrução - por Alexey Rokhin

Resposta: Postado por Microsoft em 24/11/2010 às 11:34

O requisito que OFFSET/FETCHrequer ORDER BYé uma restrição nesta liberação. No padrão ANSI SQL (SQL: 2011), onde as novas OFFSET/FETCHclá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 OFFSETuma palavra-chave reservada. Podemos removê-lo no futuro.

Agora com relação a ...

Até então, se alguém quiser usar OFFSETe FETCHsem 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;

10

Conforme indicado na parte superior da documentação em OFFSET..FETCH

A cláusula OFFSET-FETCH fornece uma opção para buscar apenas uma janela ou página de resultados do conjunto de resultados. OFFSET-FETCH pode ser usado apenas com a cláusula ORDER BY.

...

ORDER BY é obrigatório para usar as cláusulas OFFSET e FETCH.

Assim,

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;

Não é tão prático para um simples, LIMITse é para isso que você quer se manter TOP.


9

De acordo com a referência , a OFFSETcláusula faz parte do ORDER BYSQL Server. Você também precisará adicionar a ROWSpalavra - chave após a OFFSETespecificação:

SELECT *
FROM ( VALUES (1),(2),(3) ) AS t(x)
ORDER BY x
OFFSET 0 ROWS
FETCH FIRST 1 ROWS ONLY;
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.