Stránkování záznamů na straně databázového serveru je bežnou technikou používanou snad každým vývojářem aplikací, kde se získávají data z databáze. Místo získávání všech záznamů tabulky/tabulek z databáze a implementování řádkování na straně klienta, je určitě lepší implementovat stránkování na straně SQL serveru a přenést tak pouze záznamy potřebné pro současnou zobrazenou stránku. To odlehčí nejen databázovému serveru, ale hlavně aplikačnímu či klientské aplikaci.
U MS SQL 2008 R2 a nižších ale tato technika nebyla příliš lehce implementovatelná:
SELECT ROW_NUMBER() OVER (ORDER BY A) AS row, *
FROM TABLE_NAME
WHERE ( ROW_NUMBER() OVER (ORDER BY A) AS row ) BETWEEN 21 AND 30
Popřípadě pomocí vnořeného selectu:
SELECT *
FROM ( SELECT ROW_NUMBER() OVER (ORDER BY A) AS row, * FROM TABLE_NAME )
WHERE row BETWEEN 21 AND 30
Od MS SQL Serveru Denali CTP1 máme ale možnost využít rozšíření klauzule ORDER BY o OFFSET a FETCH.
SELECT *
FROM TABLE_NAME
ORDER BY ID
OFFSET 20 ROWS – přeskoč prvních 20 řádků
FETCH NEXT 10 ROWS ONLY – vyber následujících 10 řádků
Hodnoty u OFFSET a FETCH můžeme buď zadat absolutně, jak to bylo uvedeno u přechodzího příkladu, nebo také pomocí celočíselné proměnné, z poddotazu, TSQL výrazu, popř. stored function, tedy:
OFFSET @offset ROWS
OFFSET ( SELECT offset_value FROM offset_table ) ROWS
FETCH NEXT @pagasize ROWS ONLY
FETCH NEXT (SELECT pagesize FROM pagesize_table) ROWS ONLY
Snad není potřeba dodávat, že u OFFSET se musí jednat o hodnotu větší rovnu 0 a u FETCH větší než 0.