Suche…


Einführung

Zeilenversatz und Paging in verschiedenen Versionen von SQL Server

Syntax

  • SELECT * FROM TableName ORDER BY ID OFFSET 10 ROWS FETCH NÄCHSTE 10 ROWS NUR;

Pagination mit ROW_NUMBER mit einem allgemeinen Tabellenausdruck

SQL Server 2008

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

SQL Server 2012

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 Klausel OFFSET und FETCH zu verwenden.
  • OFFSET Klausel ist bei FETCH obligatorisch. Sie können niemals ORDER BYFETCH .
  • TOP kann nicht mit OFFSET und FETCH in demselben Abfrageausdruck kombiniert werden.


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow