Zoeken…


Invoering

Rijcompensatie en paging in verschillende versies van SQL Server

Syntaxis

  • SELECTEER * UIT Tabelnaam BESTEL OP ID OFFSET 10 RIJEN FETCH VOLGENDE ALLEEN 10 RIJEN;

Paginering met ROW_NUMBER met een gemeenschappelijke tabelexpressie

SQL Server 2008

De functie ROW_NUMBER kan een oplopend nummer toewijzen aan elke rij in een resultatenset. In combinatie met een Common Table Expression die een BETWEEN operator gebruikt, is het mogelijk om 'pagina's' van resultatensets te maken. Bijvoorbeeld: pagina één met resultaten 1-10, pagina twee met resultaten 11-20, pagina drie met resultaten 21-30, enzovoort.

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

Opmerking: het is niet mogelijk om ROW_NUMBER te gebruiken in een WHERE clausule zoals:

SELECT object_id,
    name,
    type,
    create_date
FROM sys.objects
WHERE ROW_NUMBER() OVER (ORDER BY name) BETWEEN 41 AND 50

Hoewel dit handiger zou zijn, retourneert SQL Server in dit geval de volgende fout:

Msg 4108, niveau 15, staat 1, regel 6

Functies in vensters kunnen alleen worden weergegeven in de clausules SELECT of ORDER BY.

Paginering met OFFSET FETCH

SQL Server 2012

De OFFSET FETCH clausule implementeert paginering op een meer beknopte manier. Hiermee is het mogelijk om N1-rijen (gespecificeerd in OFFSET ) over te slaan en de volgende N2-rijen (gespecificeerd in FETCH ) terug te geven:

SELECT *
FROM sys.objects
ORDER BY object_id
OFFSET 40 ROWS FETCH NEXT 10 ROWS ONLY

De ORDER BY clausule is vereist om deterministische resultaten te geven.

Paginaton met innerlijke zoekopdracht

In eerdere versies van SQL Server moesten ontwikkelaars dubbele sortering gebruiken in combinatie met het trefwoord TOP om rijen op een pagina te retourneren:

 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

De binnenste query retourneert de eerste 50 rijen gesorteerd op name . Vervolgens zal de buitenste query de volgorde van deze 50 rijen omkeren en de bovenste 10 rijen selecteren (dit zijn de laatste 10 rijen in de groep vóór de omkering).

Paging in verschillende versies van 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 met ORDER BY OFFSET en FETCH NEXT

Voer deze query uit om de volgende 10 rijen te krijgen:

SELECT * FROM TableName ORDER BY id OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;

Belangrijke aandachtspunten bij het gebruik ervan:

  • ORDER BY is verplicht om de OFFSET en FETCH clausule te gebruiken.
  • OFFSET clausule is verplicht bij FETCH . U kunt nooit, ORDER BY ... FETCH .
  • TOP kan niet worden gecombineerd met OFFSET en FETCH in dezelfde query-expressie.


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow