Erreur SQL Server, «Utilisation non valide de l'option FIRST dans l'instruction FETCH».

8

À partir de 2012, les documents SQL Server montrent qu'ils prennent en charge OFFSET..FETCHce que j'essaie d'utiliser au lieu d'un LIMIT.

Ce qui suit fonctionne très bien dans PostgreSQL pour échantillonner un jeu de résultats,

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

Cependant, avec SQL Server, j'obtiens

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

Que se passe t-il ici? SQL Server prend-il en charge la norme OFFSET.. FETCH?

Evan Carroll
la source

Réponses:

17

SQL Server a implémenté les clauses OFFSETet FETCHdans le cadre de la ORDER BYclause, comme indiqué par les autres réponses et documenté dans leur documentation.

Le standard SQL de l'autre côté, a ces deux clauses comme indépendantes:

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

Si quelqu'un souhaite que cette fonctionnalité soit implémentée en totale conformité avec la norme, il peut toujours faire une demande à l'équipe SQL Server, via le canal Connect. En fait, MS a commenté - dans une demande différente sur l'offset et la récupération:

Élément de connexion: SQL Denali: ajouter un compteur de lignes totales à la SELECTdéclaration - par Alexey Rokhin

Réponse: Publié par Microsoft le 24/11/2010 à 11:34

L'exigence qui OFFSET/FETCHrequiert ORDER BYest une restriction dans cette version. Dans la norme ANSI SQL (SQL: 2011) où les nouvelles OFFSET/FETCHclauses sont proposées, ORDER BYest facultative. La restriction dans SQL Server est liée à la limitation de notre technologie d'analyse qui ne peut pas gérer la syntaxe facultative sans créer OFFSETun mot clé réservé. Nous pouvons le supprimer à l'avenir.

Maintenant, en ce qui concerne ...

Jusque-là, si l'on veut utiliser OFFSETet FETCHsans spécificité ORDER BY, une solution consiste à ajouter une clause order by "ne rien faire". Exemple:

SELECT 
...
ORDER BY (SELECT NULL)
OFFSET 0 ROWS
FETCH NEXT 1 ROWS ONLY;
ypercubeᵀᴹ
la source
10

Comme indiqué en haut de la documentation sur OFFSET..FETCH

La clause OFFSET-FETCH vous offre une option pour extraire uniquement une fenêtre ou une page de résultats de l'ensemble de résultats. OFFSET-FETCH ne peut être utilisé qu'avec la clause ORDER BY.

...

ORDER BY est obligatoire pour utiliser la clause OFFSET et FETCH.

Donc,

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;

Pas tout à fait pratique pour un simple LIMITsi c'est ce que vous allez faire, vous voudrez vous en tenir TOP.

Solomon Rutzky
la source
9

Selon la référence , la OFFSETclause fait partie de ORDER BYSQL Server. Vous devrez également ajouter le ROWSmot clé après la OFFSETspécification:

SELECT *
FROM ( VALUES (1),(2),(3) ) AS t(x)
ORDER BY x
OFFSET 0 ROWS
FETCH FIRST 1 ROWS ONLY;
Dan Guzman
la source