Sök…


Introduktion

Radoffset och personsökning i olika versioner av SQL Server

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

SQL Server 2008

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

SQL Server 2012

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ända OFFSET och FETCH klausulen.
  • OFFSET klausul är obligatorisk med FETCH . Du kan aldrig använda, ORDER BY ... FETCH .
  • TOP kan inte kombineras med OFFSET och FETCH i samma frågauttryck.


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow