Résultats de la page
Une extension de la clause ORDER BY appelée OFFSET-FETCH vous permet de retourner uniquement une plage des lignes sélectionnées par votre requête. Elle ajoute la possibilité de fournir un point de départ (décalage) et une valeur pour spécifier le nombre de lignes que vous souhaitez renvoyer (une valeur d’extraction). Cette extension fournit une technique pratique pour la pagination des résultats.
Si vous souhaitez renvoyer des lignes une « page » à la fois (à l’aide du nombre que vous choisissez pour une page), vous devez considérer que chaque requête avec une clause OFFSET-FETCH s’exécute indépendamment des autres requêtes. Il n’y a pas d’état côté serveur maintenu, et vous devrez effectuer le suivi de votre position par le biais d’un jeu de résultats via du code côté client.
Syntaxe OFFSET-FETCH
La syntaxe de la clause OFFSET-FETCH, qui fait techniquement partie de la clause ORDER BY, est la suivante :
OFFSET { integer_constant | offset_row_count_expression } { ROW | ROWS }
[FETCH { FIRST | NEXT } {integer_constant | fetch_row_count_expression } { ROW | ROWS } ONLY]
Utilisation d’OFFSET-FETCH
Pour utiliser OFFSET-FETCH, vous fournissez une valeur de décalage de départ, qui peut être zéro, et un nombre facultatif de lignes à retourner, comme dans l’exemple suivant :
Cet exemple retourne les 10 premières lignes, puis retourne les 10 lignes de données de produit suivantes en fonction de ListPrice :
SELECT ProductID, ProductName, ListPrice
FROM Production.Product
ORDER BY ListPrice DESC
OFFSET 0 ROWS --Skip zero rows
FETCH NEXT 10 ROWS ONLY; --Get the next 10
Pour récupérer la page de données de produit suivante, utilisez la clause OFFSET pour spécifier le nombre de lignes à ignorer :
SELECT ProductID, ProductName, ListPrice
FROM Production.Product
ORDER BY ListPrice DESC
OFFSET 10 ROWS --Skip 10 rows
FETCH NEXT 10 ROWS ONLY; --Get the next 10
Dans la définition de la syntaxe, vous pouvez voir que la clause OFFSET est obligatoire, mais pas la clause FETCH. Si la clause FETCH est omise, toutes les lignes suivantes sont retournées. Vous constaterez également que les mots clés ROW et ROWS sont interchangeables, comme FIRST et NEXT, ce qui permet une syntaxe plus naturelle.
Pour garantir la précision des résultats, en particulier lorsque vous passez d’une page à l’autre, il est important de construire une clause ORDER BY qui fournira un classement unique et produira un résultat déterministe. En raison de la façon dont l’optimiseur de requête de SQL Server fonctionne, il est techniquement possible qu’une ligne apparaisse sur plusieurs pages, sauf si la plage de lignes est déterministe.