Microsoft SQL Server
Paginering
Sök…
Introduktion
Syntax
- VÄLJ * FRÅN tabellnamn BESTÄLLNING AV ID-OFFSET 10 ROWS FETCH NÄSTA 10 ROWS;
Pagination med ROW_NUMBER med ett vanligt tabelluttryck
Funktionen ROW_NUMBER
kan tilldela ett inkrementeringsnummer till varje rad i en resultatuppsättning. Kombinerat med ett vanligt tabelluttryck som använder en BETWEEN
operatör är det möjligt att skapa "sidor" av resultatset. Till exempel: sida ett som innehåller resultat 1-10, sida två som innehåller resultat 11-20, sida tre som innehåller resultat 21-30, och så vidare.
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
Obs! Det är inte möjligt att använda ROW_NUMBER
i en WHERE
klausul som:
SELECT object_id,
name,
type,
create_date
FROM sys.objects
WHERE ROW_NUMBER() OVER (ORDER BY name) BETWEEN 41 AND 50
Även om detta skulle vara mer praktiskt kommer SQL-server att returnera följande fel i detta fall:
Msg 4108, nivå 15, tillstånd 1, rad 6
Slingade funktioner kan endast visas i SELECT- eller ORDER BY-klausulerna.
Pagination med OFFSET FETCH
OFFSET FETCH
klausulen implementerar paginationen på ett mer kortfattat sätt. Med det är det möjligt att hoppa över N1-rader (specificeras i OFFSET
) och returnera de nästa N2-raderna (specificerade i FETCH
):
SELECT *
FROM sys.objects
ORDER BY object_id
OFFSET 40 ROWS FETCH NEXT 10 ROWS ONLY
ORDER BY
klausulen krävs för att ge deterministiska resultat.
Paginaton med inre fråga
I tidigare versioner av SQL Server var utvecklarna tvungna att använda dubbel sortering i kombination med TOP
nyckelordet för att returnera rader på en sida:
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
Den inre frågan returnerar de första 50 raderna som beställts efter name
. Då kommer den yttre frågan att vända ordningen på dessa 50 rader och välj de 10 bästa raderna (dessa kommer att vara de sista 10 raderna i gruppen innan vändningen).
Sökning i olika versioner av 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 med ORDER BY OFFSET och FETCH NEXT
För att få de kommande tio raderna kör bara den här frågan:
SELECT * FROM TableName ORDER BY id OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;
Viktiga punkter att tänka på när du använder den:
-
ORDER BY
är obligatoriskt att användaOFFSET
ochFETCH
klausulen. -
OFFSET
klausul är obligatorisk medFETCH
. Du kan aldrig använda,ORDER BY
...FETCH
. -
TOP
kan inte kombineras medOFFSET
ochFETCH
i samma frågauttryck.