Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Implementieren von Paging mit OFFSET FETCH NEXT in SQL Server

Eine Datenbank kann Hunderttausende von Datensätzen enthalten. Es ist einfach, diese Datensätze über Datenbankverwaltungssysteme wie SQL Server oder MySQL usw. einzufügen und auszuwählen. Es ist jedoch nicht einfach, Tausende von Datensätzen auf einer einzigen Webseite oder in einer Desktop-Anwendung anzuzeigen. Platz- und Speicherbeschränkungen machen es schwierig, eine große Anzahl von Datensätzen auf einmal anzuzeigen.

Eine übliche Lösung für ein solches Problem ist die Implementierung von Paging. (Beachten Sie, dass dies kein von Betriebssystemen implementiertes Speicher-Paging ist.) Paging in der Programmierung bezieht sich auf die Anzeige von Daten über eine Reihe von Seiten. Eine zufällige Google-Suche kann zu Tausenden von Ergebnissen führen. Google verwendet Paging, um diese Ergebnisse anzuzeigen. Wenn Sie auf der Google-Seite mit den Suchergebnissen nach unten scrollen, sehen Sie Folgendes:

Hier sehen Sie die Anzahl der Seiten, auf die das Suchergebnis aufgeteilt ist. Sie können auf den Link Weiter klicken, um weitere Seiten anzuzeigen.

In diesem Artikel werden wir sehen, wie OFFSET FETCH NEXT-Operatoren verwendet werden können, um Paging in Front-End-Anwendungen zu implementieren. Wir beginnen mit einem einfachen Beispiel unter Verwendung des Operators OFFSET FETCH NEXT und sehen uns dann an, wie er mit Hilfe einer gespeicherten Prozedur praktisch verwendet werden kann.

Verwendung von OFFSET FETCH NEXT für Paging in SQL Server

SQL Server enthält die Operatoren OFFSET &NEXT zum Implementieren von Paging. Der OFFSET-Operator versetzt die nächste Anzahl K von Suchergebnissen von Anfang an, während der FETCH NEXT-Operator die NÄCHSTEN N Ergebnisse abruft, wobei K und N ganze Zahlen sind.

Dummy-Daten vorbereiten

Bevor wir OFFSET FETCH NEXT in Aktion sehen können, erstellen wir eine Dummy-Datenbank mit 200 Datensätzen. Sie können eine funktionierende Datenbank verwenden, wenn Sie sich zu 100 % sicher sind, dass sie ordnungsgemäß gesichert wurde. Führen Sie dazu das folgende Skript aus:

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
)

Im obigen Skript erstellen wir eine Dummy-Datenbank ShowRoom mit einer Tabelle namens Cars. Fügen wir dieser Datenbank einige Dummy-Datensätze hinzu. Führen Sie das folgende Skript aus:

 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

Schauen Sie sich das obige Skript genau an. Das obige Skript fügt 200 Dummy-Datensätze in die Cars-Tabelle ein. Das Skript verwendet eine While-Schleife für 200 Iterationen. Bei jeder Iteration wird das Wort „Car -“ an die Iterationsnummer angehängt und das Ergebnis in die Namensspalte der Cars-Tabelle eingefügt. In ähnlicher Weise wird das Wort „Firma –“ an die Iterationsnummer angehängt und bei jeder Iteration in die Firmenspalte eingefügt. Schließlich wird bei jeder Iteration die Iterationsnummer mit 5 multipliziert und das Ergebnis in die Potenzspalte eingesetzt. Wenn Sie nun alle Datensätze aus der Cars-Tabelle auswählen, sehen Sie 200 Datensätze in der Ergebnismenge. Führen Sie dazu die folgende Abfrage aus:

SELECT * FROM Cars

Screenshot des Teilergebnisses der obigen Abfrage ist wie folgt. Im Ergebnis sehen Sie 200 Zeilen.

OFFSET FETCH NEXT Beispiel

Sehen wir uns nun OFFSET NEXT in Aktion an. Die Syntax von OFFSET NEXT ist wie folgt:

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

Es ist wichtig, hier zu erwähnen, dass Sie die ORDER BY-Klausel mit OFFSET FETCH NEXT-Klauseln verwenden müssen.

Sehen wir uns ein einfaches Beispiel für OFFSET FETCH NEXT an, bei dem wir die Daten nach der ID-Spalte der Cars-Tabelle ordnen, die ersten 20 Zeilen überspringen und die nächsten 10 Zeilen abrufen. Führen Sie das folgende Skript aus:

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

In der Ausgabe des obigen Skripts sehen Sie Datensätze mit einem ID-Wert von 21 bis 30, da wir die ersten 20 Datensätze übersprungen und die nächsten 10 abgerufen haben.

Verwendung von OFFSET FETCH NEXT mit gespeicherter Prozedur

Wenn Sie Paging in einer Front-End-Anwendung wie einer Website oder einer Desktop-Anwendung implementieren, senden Sie normalerweise Werte für Seitenzahl und Seitengröße über eine gespeicherte Prozedur an den Server. Abhängig vom Wert der Seitenzahl und der Seitengröße gibt die gespeicherte Prozedur den richtigen Zeilensatz zurück. Lassen Sie uns eine solche gespeicherte Prozedur schreiben, die Seitennummer und Seitengröße als Parameter nimmt und die entsprechenden Datensätze zurückgibt.

Sehen Sie sich das folgende Skript an:

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

Im obigen Skript erstellen wir eine gespeicherte Prozedur spGetRecordsByPageAndSize, die die beiden Parameter @Page und @Size akzeptiert. Die gespeicherte Prozedur verwendet OFFSET FETCH NEXT, um Datensätze nach Seitenanzahl und Seitengröße zu filtern. Wenn beispielsweise die Seitenzahl 2 und die Größe 20 ist, lautet der OFFSET:

(2 – 1) * 20 =20

Und der Wert für FETCH next wird gleich der @Size sein, also 20. Daher werden die Datensätze mit den IDs 21 bis 40 zurückgegeben. Führen Sie das obige Skript aus, um eine gespeicherte Prozedur zu erstellen.
Sobald Sie die gespeicherte Prozedur erstellt haben, führen Sie das folgende Skript aus, um zu sehen, was zurückgegeben wird, wenn die Seitenzahl 2 und die Seitengröße 20 ist.

EXECUTE spGetRecordsByPageAndSize 2, 20

Die Ausgabe des obigen Skripts sieht folgendermaßen aus:

Wenn Sie auf ähnliche Weise Datensätze für die vierte Seite mit 15 Datensätzen pro Seite abrufen möchten, ruft die folgende Abfrage die Datensätze von ID 46 bis ID 60 ab.

EXECUTE spGetRecordsByPageAndSize 4, 15

Die Ausgabe von sieht so aus:

Schlussfolgerung

OFFSET FETCH NEXT ist ein äußerst nützliches Werkzeug, insbesondere wenn Sie eine große Anzahl von Datensätzen in Seiten gruppiert anzeigen möchten. In diesem Artikel haben wir gesehen, wie es in Verbindung mit einer gespeicherten Prozedur verwendet wird, um Paging in Front-End-Anwendungen zu implementieren.