Microsoft SQL Server
Paginering
Zoeken…
Invoering
Syntaxis
- SELECTEER * UIT Tabelnaam BESTEL OP ID OFFSET 10 RIJEN FETCH VOLGENDE ALLEEN 10 RIJEN;
Paginering met ROW_NUMBER met een gemeenschappelijke tabelexpressie
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
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 deOFFSET
enFETCH
clausule te gebruiken. -
OFFSET
clausule is verplicht bijFETCH
. U kunt nooit,ORDER BY
...FETCH
. -
TOP
kan niet worden gecombineerd metOFFSET
enFETCH
in dezelfde query-expressie.