Adatbázis.Útmutató

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 |+-----------+---------+

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.