a lapozást gyakran használják olyan alkalmazásokban, ahol a felhasználó rákattinthat Előző/Következő navigálni az eredményeket alkotó oldalakon, vagy kattintson egy oldalszámra, hogy közvetlenül egy adott oldalra lépjen.
amikor lekérdezéseket futtat az SQL Server rendszerben, az eredményeket a OFFSET
és a FETCH
argumentum ORDER BY
záradék argumentumaival lehet lapozni. Ezeket az argumentumokat az SQL Server 2012-ben vezették be, ezért használhatja ezt a technikát, ha SQL Server 2012 vagy újabb verzióval rendelkezik.
ebben az összefüggésben a lapozás az, ahol a lekérdezés eredményeit kisebb darabokra osztja, mindegyik darab ott folytatódik, ahol az előző befejeződött. Ha például egy lekérdezés 1000 sort ad vissza, akkor lapozhatja őket úgy, hogy 100-as csoportokban kerüljenek vissza. Egy alkalmazás átadhatja az oldalszámot és az oldalméretet az SQL Server – nek, majd az SQL Server segítségével csak a kért oldal adatait adhatja vissza.
1. példa – nincs Lapozás
először futtassunk egy lekérdezést, amely a táblázat összes sorát adja vissza:
SELECT *FROM GenresORDER BY GenreId;
eredmény:
+-----------+---------+| GenreId | Genre ||-----------+---------|| 1 | Rock || 2 | Jazz || 3 | Country || 4 | Pop || 5 | Blues || 6 | Hip Hop || 7 | Rap || 8 | Punk |+-----------+---------+
Ez a példa nem használ lapozást – minden eredmény megjelenik.
Ez az eredményhalmaz olyan kicsi, hogy általában nem igényel lapozást,de a cikk alkalmazásában lapozzunk.
2. példa-az első 3 eredmény megjelenítése
Ez a példa az első három eredményt jeleníti meg:
SELECT *FROM GenresORDER BY GenreId OFFSET 0 ROWS FETCH NEXT 3 ROWS ONLY;
eredmény:
+-----------+---------+| GenreId | Genre ||-----------+---------|| 1 | Rock || 2 | Jazz || 3 | Country |+-----------+---------+
ebben az esetben megadom, hogy az eredményeknek az első eredménynél kell kezdődniük, és a következő három sort kell megjeleníteniük. Ez a következő módon történik:
-
OFFSET 0 ROWS
megadja, hogy ne legyen eltolás (nulla eltolás). -
FETCH NEXT 3 ROWS ONLY
megkapja a következő három sort az eltolásból. Mivel nulla eltolást adtam meg, az első három sor lekérésre kerül.
Ha csak a legjobb 3 eredményt akartuk volna elérni, ugyanazt az eredményt a TOP
záradék használatával érhettük volna el az offset és fetch értékek megadása helyett. Ez azonban nem tette volna lehetővé a következő rész elvégzését.
3. példa-a következő 3 eredmény megjelenítése
most jelenítsük meg a következő három eredményt:
SELECT *FROM GenresORDER BY GenreId OFFSET 3 ROWS FETCH NEXT 3 ROWS ONLY;
eredmény:
+-----------+---------+| GenreId | Genre ||-----------+---------|| 4 | Pop || 5 | Blues || 6 | Hip Hop |+-----------+---------+
tehát az egyetlen dolog, amit megváltoztattam, az az eltolás volt.
az eltolási és lekérési értékek lehetnek változó, paraméter vagy konstans skalár alkérdezés formájában megadott kifejezések is. Ha egy al lekérdezést használ, nem hivatkozhat a külső lekérdezés hatókörében meghatározott oszlopokra (nem lehet korrelálni a külső lekérdezéssel).
a következő példák kifejezésekkel mutatják be az eredmények lapozásának két megközelítését.
4. példa – sorszám szerinti Lapozás
Ez a példa kifejezésekkel adja meg a kezdő sor számát.
DECLARE @StartRow int = 1, @RowsPerPage int = 3; SELECT * FROM GenresORDER BY GenreId ASC OFFSET @StartRow - 1 ROWS FETCH NEXT @RowsPerPage ROWS ONLY;
eredmény:
+-----------+---------+| GenreId | Genre ||-----------+---------|| 1 | Rock || 2 | Jazz || 3 | Country |+-----------+---------+
itt a @StartRow int = 1
segítségével adhatom meg, hogy az eredmények az első sorban kezdődjenek.
Ez történik, ha ezt az értéket 2
értékre növelem.
DECLARE @StartRow int = 2, @RowsPerPage int = 3; SELECT * FROM GenresORDER BY GenreId ASC OFFSET @StartRow - 1 ROWS FETCH NEXT @RowsPerPage ROWS ONLY;
eredmény:
+-----------+---------+| GenreId | Genre ||-----------+---------|| 2 | Jazz || 3 | Country || 4 | Pop |+-----------+---------+
a második sorban kezdődik. Ezzel a módszerrel megadhatom a pontos sort, amelyen kezdeni kell.
5. példa – oldalszám szerinti Lapozás
Ez a példa majdnem megegyezik az előző példával, azzal a különbséggel, hogy lehetővé teszi az oldalszám megadását, szemben a sorszámmal.
DECLARE @PageNumber int = 1, @RowsPerPage int = 3; SELECT * FROM GenresORDER BY GenreId ASC OFFSET (@PageNumber - 1) * @RowsPerPage ROWS FETCH NEXT @RowsPerPage ROWS ONLY;
eredmény:
+-----------+---------+| GenreId | Genre ||-----------+---------|| 1 | Rock || 2 | Jazz || 3 | Country |+-----------+---------+
tehát az első eredmény ugyanaz. Lássuk azonban, mi történik, ha a @PageNumber
– et 2
– re növeljük (átneveztem ezt a változót, hogy tükrözze az új célját).
DECLARE @PageNumber int = 2, @RowsPerPage int = 3; SELECT * FROM GenresORDER BY GenreId ASC OFFSET (@PageNumber - 1) * @RowsPerPage ROWS FETCH NEXT @RowsPerPage ROWS ONLY;
eredmény:
+-----------+---------+| GenreId | Genre ||-----------+---------|| 4 | Pop || 5 | Blues || 6 | Hip Hop |+-----------+---------+
ezúttal az eredmények a negyedik sorban kezdődnek. Tehát ezzel a módszerrel egyszerűen átadhatja az oldalszámot, nem pedig a sorszámot.
6.példa – lapozási hurok
a befejezéshez itt van egy gyors példa, amely az összes oldalt végighurkolja, és megadja az egyes iterációk kezdő sorszámát:
DECLARE @StartRow int = 1, @RowsPerPage int = 3;WHILE (SELECT COUNT(*) FROM Genres) >= @StartRow BEGIN SELECT * FROM Genres ORDER BY GenreId ASC OFFSET @StartRow - 1 ROWS FETCH NEXT @RowsPerPage ROWS ONLY;SET @StartRow = @StartRow + @RowsPerPage; CONTINUEEND;
eredmény:
+-----------+---------+| GenreId | Genre ||-----------+---------|| 1 | Rock || 2 | Jazz || 3 | Country |+-----------+---------+(3 rows affected)+-----------+---------+| GenreId | Genre ||-----------+---------|| 4 | Pop || 5 | Blues || 6 | Hip Hop |+-----------+---------+(3 rows affected)+-----------+---------+| GenreId | Genre ||-----------+---------|| 7 | Rap || 8 | Punk |+-----------+---------+(2 rows affected)
7. sor vs. sor példa
a ROW
kódot használó kód a ROWS
helyett mindkét argumentum ugyanazt csinálja. Ezek szinonimák, és ANSI kompatibilitást biztosítanak.
itt az első példa ezen az oldalon, de a ROW
helyett ROWS
.
SELECT *FROM GenresORDER BY GenreId OFFSET 0 ROW FETCH NEXT 3 ROW ONLY;
eredmény:
+-----------+---------+| GenreId | Genre ||-----------+---------|| 1 | Rock || 2 | Jazz || 3 | Country |+-----------+---------+
példa 8 – első vs következő
ugyanez vonatkozik a FIRST
és NEXT
. Ezek az ANSI kompatibilitást biztosító szinonimák.
itt van az előző példa, de a FIRST
helyett NEXT
.
SELECT *FROM GenresORDER BY GenreId OFFSET 0 ROW FETCH FIRST 3 ROW ONLY;
eredmény:
+-----------+---------+| GenreId | Genre ||-----------+---------|| 1 | Rock || 2 | Jazz || 3 | Country |+-----------+---------+