Microsoft SQL Server
Seitennummerierung
Suche…
Einführung
Syntax
- SELECT * FROM TableName ORDER BY ID OFFSET 10 ROWS FETCH NÄCHSTE 10 ROWS NUR;
Pagination mit ROW_NUMBER mit einem allgemeinen Tabellenausdruck
Die ROW_NUMBER
Funktion kann jeder Zeile in einer Ergebnismenge eine inkrementierende Nummer zuweisen. In Kombination mit einem Common Table Expression , der einen BETWEEN
Operator verwendet, können "Ergebnisseiten" erstellt werden. Beispiel: Seite 1 mit den Ergebnissen 1-10, Seite zwei mit den Ergebnissen 11-20, Seite drei mit den Ergebnissen 21-30 usw.
WITH data
AS
(
SELECT ROW_NUMBER() OVER (ORDER BY name) AS row_id,
object_id,
name,
type,
create_date
FROM sys.objects
)
SELECT *
FROM data
WHERE row_id BETWEEN 41 AND 50
Anmerkung: Es ist nicht möglich, ROW_NUMBER
in einer WHERE
Klausel wie ROW_NUMBER
zu verwenden:
SELECT object_id,
name,
type,
create_date
FROM sys.objects
WHERE ROW_NUMBER() OVER (ORDER BY name) BETWEEN 41 AND 50
Obwohl dies bequemer wäre, gibt der SQL Server in diesem Fall den folgenden Fehler zurück:
Meldung 4108, Ebene 15, Status 1, Zeile 6
Fensterfunktionen können nur in den SELECT- oder ORDER BY-Klauseln angezeigt werden.
Paginierung mit OFFSET FETCH
Die Klausel OFFSET FETCH
implementiert die Paginierung in OFFSET FETCH
Weise. Damit können Sie N1-Zeilen (in OFFSET
) überspringen und die nächsten N2-Zeilen (in FETCH
) zurückgeben:
SELECT *
FROM sys.objects
ORDER BY object_id
OFFSET 40 ROWS FETCH NEXT 10 ROWS ONLY
Die ORDER BY
Klausel ist erforderlich, um deterministische Ergebnisse bereitzustellen.
Paginaton mit innerer Frage
In früheren Versionen von SQL Server mussten Entwickler die doppelte Sortierung in Kombination mit dem Schlüsselwort TOP
, um Zeilen auf einer Seite zurückzugeben:
SELECT TOP 10 *
FROM
(
SELECT
TOP 50 object_id,
name,
type,
create_date
FROM sys.objects
ORDER BY name ASC
) AS data
ORDER BY name DESC
Die innere Abfrage gibt die ersten 50 Zeilen nach name
sortiert zurück. Die äußere Abfrage wird dann die Reihenfolge dieser 50 Zeilen umkehren und die ersten 10 Zeilen auswählen (dies sind die letzten 10 Zeilen in der Gruppe vor der Umkehrung).
Paging in verschiedenen Versionen von SQL Server
SQL Server 2012/2014
DECLARE @RowsPerPage INT = 10, @PageNumber INT = 4
SELECT OrderId, ProductId
FROM OrderDetail
ORDER BY OrderId
OFFSET (@PageNumber - 1) * @RowsPerPage ROWS
FETCH NEXT @RowsPerPage ROWS ONLY
SQL Server 2005/2008 / R2
DECLARE @RowsPerPage INT = 10, @PageNumber INT = 4
SELECT OrderId, ProductId
FROM (
SELECT OrderId, ProductId, ROW_NUMBER() OVER (ORDER BY OrderId) AS RowNum
FROM OrderDetail) AS OD
WHERE OD.RowNum BETWEEN ((@PageNumber - 1 ) * @RowsPerPage) + 1
AND @RowsPerPage * @PageNumber
SQL Server 2000
DECLARE @RowsPerPage INT = 10, @PageNumber INT = 4
SELECT OrderId, ProductId
FROM (SELECT TOP (@RowsPerPage) OrderId, ProductId
FROM (SELECT TOP ((@PageNumber)*@RowsPerPage) OrderId, ProductId
FROM OrderDetail
ORDER BY OrderId) AS OD
ORDER BY OrderId DESC) AS OD2
ORDER BY OrderId ASC
SQL Server 2012/2014 mit ORDER BY OFFSET und FETCH NEXT
Um die nächsten 10 Zeilen zu erhalten, führen Sie einfach die folgende Abfrage aus:
SELECT * FROM TableName ORDER BY id OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;
Wichtige Punkte bei der Verwendung:
-
ORDER BY
ist zwingend erforderlich, um die KlauselOFFSET
undFETCH
zu verwenden. -
OFFSET
Klausel ist beiFETCH
obligatorisch. Sie können niemalsORDER BY
…FETCH
. -
TOP
kann nicht mitOFFSET
undFETCH
in demselben Abfrageausdruck kombiniert werden.