Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Implémentation de la pagination à l'aide de OFFSET FETCH NEXT dans SQL Server

Une base de données peut contenir des centaines de milliers d'enregistrements. Il est facile d'insérer et de sélectionner ces enregistrements via des systèmes de gestion de base de données tels que SQL Server ou MySQL, etc. Cependant, il n'est pas facile d'afficher des milliers d'enregistrements sur une seule page Web ou dans une application de bureau. Les contraintes d'espace et de mémoire rendent difficile l'affichage simultané d'un grand nombre d'enregistrements.

Une solution courante à un tel problème consiste à implémenter la pagination. (Notez qu'il ne s'agit pas de la pagination de la mémoire mise en œuvre par les systèmes d'exploitation) La pagination dans la programmation fait référence à l'affichage de données via une série de pages. Une recherche aléatoire sur Google peut aboutir à des milliers de résultats. Google utilise la pagination pour afficher ces résultats. Si vous faites défiler la page Google avec les résultats de recherche, vous verrez ce qui suit :

Ici, vous pouvez voir le nombre de pages dans lesquelles le résultat de la recherche est divisé. Vous pouvez cliquer sur le lien Suivant pour voir plus de pages.

Dans cet article, nous verrons comment les opérateurs OFFSET FETCH NEXT peuvent être utilisés pour implémenter la pagination sur les applications frontales. Nous commencerons par un exemple simple utilisant l'opérateur OFFSET FETCH NEXT et verrons ensuite comment il peut être utilisé concrètement à l'aide d'une procédure stockée.

Utilisation de OFFSET FETCH NEXT pour la pagination dans SQL Server

SQL Server contient les opérateurs OFFSET &NEXT pour implémenter la pagination. L'opérateur OFFSET décale le nombre K suivant de résultats de recherche depuis le début, tandis que l'opérateur FETCH NEXT récupère les NEXT N résultats où K et N sont des entiers.

Préparation des données factices

Avant de voir OFFSET FETCH NEXT en action, créons une base de données factice avec 200 enregistrements. Vous pouvez utiliser une base de données opérationnelle si vous êtes sûr à 100 % qu'elle est correctement sauvegardée. Exécutez le script suivant pour ce faire :

CREATE Database ShowRoom;
GO
USE ShowRoom;

CREATE TABLE Cars
(
id INT PRIMARY KEY IDENTITY,
name VARCHAR(50) NOT NULL,
company VARCHAR(50) NOT NULL,
power INT NOT NULL
)

Dans le script ci-dessus, nous créons une base de données factice ShowRoom avec une table appelée Cars. Ajoutons quelques enregistrements factices dans cette base de données. Exécutez le script suivant :

 USE ShowRoom
DECLARE @count INT
SET @count = 1

DECLARE @carname VARCHAR (50)
DECLARE @company_name VARCHAR (50)

 WHILE (@count <= 200)
 BEGIN
	  SET @carname = 'Car - ' + LTRIM(@count)
	  SET @company_name = 'Company - '+ LTRIM(@count)
	  INSERT INTO Cars VALUES (@carname, @company_name, @count * 5)
	  SET @count = @count + 1
END

Jetez un oeil attentif au script ci-dessus. Le script ci-dessus insère 200 enregistrements factices dans la table Cars. Le script utilise une boucle while pour 200 itérations. Chaque itération ajoute le mot « Car - » au numéro d'itération et le résultat est inséré dans la colonne de nom de la table Cars. De même, le mot "Société -" est ajouté au numéro d'itération et est inséré dans la colonne de la société à chaque itération. Enfin, à chaque itération, le numéro d'itération est multiplié par 5 et le résultat est inséré dans la colonne de puissance. Maintenant, si vous sélectionnez tous les enregistrements de la table Cars, vous verrez 200 enregistrements dans le jeu de résultats. Exécutez la requête suivante pour ce faire :

SELECT * FROM Cars

La capture d'écran du résultat partiel de la requête ci-dessus est la suivante. Vous pouvez voir 200 lignes dans le résultat.

Exemple de DECALAGE FETCH NEXT

Regardons maintenant OFFSET NEXT en action. La syntaxe de OFFSET NEXT est la suivante :

SELECT * FROM Table_Name
ORDER BY COLUMN_NAME/S
OFFSET Number_of_rows_to_Skip ROWS
FETCH NEXT Number_of_rows_to_Fetch ROWS ONLY

Il est important de mentionner ici que vous devez utiliser la clause ORDER BY avec les clauses OFFSET FETCH NEXT.

Voyons un exemple simple de OFFSET FETCH NEXT où nous allons ordonner les données par la colonne id de la table Cars, ignorer les 20 premières lignes et récupérer les 10 lignes suivantes. Exécutez le script suivant :

USE ShowRoom
SELECT * FROM Cars
ORDER BY id
OFFSET 20 ROWS
FETCH NEXT 10 ROWS ONLY

Dans la sortie du script ci-dessus, vous verrez des enregistrements avec une valeur d'identifiant de 21 à 30 puisque nous avons ignoré les 20 premiers enregistrements et récupéré les 10 suivants.

Utilisation de OFFSET FETCH NEXT avec la procédure stockée

Si vous implémentez la pagination dans une application frontale telle qu'un site Web ou une application de bureau, vous enverrez généralement des valeurs de numéro de page et de taille de page au serveur via une procédure stockée. En fonction de la valeur du numéro de page et de la taille de la page, la procédure stockée renverra le jeu de lignes correct. Écrivons une telle procédure stockée qui prend le numéro de page et la taille de la page comme paramètres et renvoie les enregistrements correspondants.

Jetez un oeil au script suivant :

USE ShowRoom
GO
CREATE PROC spGetRecordsByPageAndSize
@Page INT,
@Size INT
AS
BEGIN
	SELECT * FROM Cars
	ORDER BY id
	OFFSET (@Page -1) * @Size ROWS
	FETCH NEXT @Size ROWS ONLY
END

Dans le script ci-dessus, nous créons une procédure stockée spGetRecordsByPageAndSize qui prend 2 paramètres @Page et @Size. La procédure stockée utilise OFFSET FETCH NEXT pour filtrer les enregistrements en fonction d'un nombre de pages et d'une taille de page. Par exemple, si le numéro de page est 2 et la taille est 20, le DECALAGE sera :

(2 – 1) * 20 =20

Et la valeur de FETCH next sera égale à @Size, c'est-à-dire 20. Par conséquent, les enregistrements avec les identifiants 21 à 40 seront renvoyés. Exécutez le script ci-dessus pour créer une procédure stockée.
Une fois que vous avez créé la procédure stockée, exécutez le script suivant pour voir ce qui est renvoyé lorsque le numéro de page est 2 et la taille de la page est 20.

EXECUTE spGetRecordsByPageAndSize 2, 20

La sortie du script ci-dessus ressemble à ceci :

De même, si vous souhaitez récupérer les enregistrements de la 4ème page avec 15 enregistrements par page, la requête suivante récupère les enregistrements de l'ID 46 à l'ID 60.

EXECUTE spGetRecordsByPageAndSize 4, 15

La sortie de ressemble à ceci :

Conclusion

OFFSET FETCH NEXT est un outil extrêmement utile, en particulier si vous souhaitez afficher un grand nombre d'enregistrements regroupés en pages. Dans cet article, nous avons vu comment il est utilisé conjointement avec une procédure stockée pour implémenter la pagination sur les applications frontales.