Seitenergebnisse

Abgeschlossen

Eine Erweiterung der ORDER BY-Klausel namens OFFSET-FETCH ermöglicht es Ihnen, nur einen Bereich der von Ihrer Abfrage ausgewählten Zeilen zurückzugeben. Sie bietet die Möglichkeit, einen Ausgangspunkt (einen Offset) und einen Wert bereitzustellen, um anzugeben, wie viele Zeilen zurückgegeben werden sollen (ein Abrufwert). Diese Erweiterung bietet ein praktisches Verfahren für eine seitenweise Ausgabe von Ergebnissen.

Wenn Sie Zeilen „seitenweise“ zurückgeben möchten (mit einer beliebigen Anzahl, die Sie für eine Seite auswählen), müssen Sie berücksichtigen, dass jede Abfrage mit einer OFFSET-FETCH-Klausel unabhängig von anderen Abfragen ausgeführt wird. Es wird kein serverseitiger Zustand verwaltet, und Sie müssen Ihre Position über ein Resultset über clientseitigen Code nachverfolgen.

OFFSET-FETCH-Syntax

Die Syntax für die OFFSET-FETCH-Klausel, die technisch gesehen Teil der ORDER BY-Klausel ist, lautet wie folgt:

OFFSET { integer_constant | offset_row_count_expression } { ROW | ROWS }
[FETCH { FIRST | NEXT } {integer_constant | fetch_row_count_expression } { ROW | ROWS } ONLY]

Verwenden von OFFSET-FETCH

Um OFFSET-FETCH zu verwenden, geben Sie einen OFFSET-Startwert an, der null sein kann, und eine optionale Anzahl von Zeilen, die zurückgegeben werden sollen, wie im folgenden Beispiel gezeigt:

In diesem Beispiel werden die ersten 10 Zeilen und dann die nächsten 10 Zeilen mit Produktdaten basierend auf ListPrice zurückgegeben:

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

Verwenden Sie zum Abrufen der nächsten Seite mit Produktdaten die OFFSET-Klausel, um die Anzahl der zu überspringenden Zeilen anzugeben:

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

In der Syntaxdefinition sehen Sie, dass die OFFSET-Klausel erforderlich ist, die FETCH-Klausel jedoch nicht. Wenn die FETCH-Klausel ausgelassen wird, werden alle Zeilen zurückgegeben, auf auf OFFSET folgen. Sie werden auch feststellen, dass die Schlüsselwörter ROW und ROWS austauschbar sind, ebenso wie FIRST und NEXT, was eine natürlichere Syntax ermöglicht.

Um die Genauigkeit der Ergebnisse sicherzustellen, insbesondere wenn Sie von Seite zu Seite der Daten wechseln, ist es wichtig, eine ORDER BY-Klausel zu erstellen, die eine eindeutige Reihenfolge bereitstellt und ein deterministisches Ergebnis liefert. Aufgrund der Funktionsweise des SQL Server-Abfrageoptimierers ist es technisch möglich, dass eine Zeile auf mehr als einer Seite angezeigt wird, es sei denn, der Zeilenbereich ist deterministisch.