SQL Paging

Van egy alapszabály a lekrédezéseknél, amit nagyon sokan – leginkább az üzleti felhasználók – elfelejtenek, mégpedig az, hogy csakis annyi adatot jelenítsünk meg, amennyire tényleg szükség van és kezelhető mennyiség. Ez valamikor 1 sor, de előfordulhat, hogy több száz sorról van szó. Ez utóbbit egy weboldalon megjeleníteni nem egy jó ötlet, lassú lehet az oldal betöltése; itt jön képbe a paging, lapozás.

Képzeljük el, hogy van egy weboldal, amin egy GridView-ban szeretnénk megjeleníteni sok-sok sort és oszlopot. A cél az, hogy a sorok száma egy oldalon a web fejlesztő által állítható legyen és meg tudja adni az oldal számát is. Az alábbi kód egy minta a lapozás megvalósításához:

 1USE [tempdb];
 2GO
 3 
 4--teszt tábla létrehozása, aminek az adatait fogjuk "lapozni"
 5CREATE TABLE [dbo].[PagingTestTable]
 6(
 7    [id] int identity,
 8    [name] varchar(10)
 9);
10GO
11 
12--feltöltjük adattal a teszt táblát
13DECLARE @i int;
14SET @i = 0;
15 
16WHILE @i < 1000
17    BEGIN
18        INSERT INTO [dbo].[PagingTestTable] ([name]) VALUES ('row' + CAST(@i AS varchar(4)));
19        --SQL 2008+
20        SET @i += 1;
21        --SQL 2005
22        --SET @i = @i + 1;
23    END;
24GO
25 
26--példa: 10 sor egy oldalon és a 2. oldalt akarjuk látni
27DECLARE @Page int;
28DECLARE @PageSize int;
29 
30SET @Page = 2;
31SET @PageSize = 10;
32 
33 
34;WITH CTE AS
35(
36    SELECT
37        ROW_NUMBER() OVER (ORDER BY [ID] ASC) AS [Row],
38        [name]
39    FROM
40        [dbo].[PagingTestTable]
41)
42SELECT * FROM CTE
43WHERE
44    [Row] BETWEEN (@Page * @PageSize) - @PageSize + 1 AND (@Page * @PageSize);

A kód SQL 2005 és újabb verziókon működik. A Denali-ban – ami már az SQL Server 2012 nevet viseli – az OFFSET parancs is használható.