Databáze může mít stovky tisíc záznamů. Tyto záznamy je snadné vkládat a vybírat pomocí systémů pro správu databází, jako je SQL Server nebo MySQL atd. Není však snadné zobrazit tisíce záznamů na jediné webové stránce nebo v desktopové aplikaci. Omezení místa a paměti ztěžují zobrazení velkého počtu záznamů najednou.
Běžným řešením takového problému je implementace stránkování. (Všimněte si, že se nejedná o stránkování paměti implementované operačními systémy) Stránkování v programování se týká zobrazení dat prostřednictvím řady stránek. Náhodné vyhledávání Google může vést k tisícům výsledků. Google k zobrazení těchto výsledků používá stránkování. Pokud rolujete dolů na stránce Google s výsledky vyhledávání, uvidíte toto:
Zde vidíte počet stránek, na které je výsledek vyhledávání rozdělen. Kliknutím na odkaz Další zobrazíte další stránky.
V tomto článku uvidíme, jak lze operátory OFFSET FETCH NEXT použít k implementaci stránkování na front-end aplikacích. Začneme jednoduchým příkladem pomocí operátoru OFFSET FETCH NEXT a poté uvidíme, jak jej lze prakticky použít pomocí uložené procedury.
Použití OFFSET FETCH NEXT pro stránkování v SQL Server
SQL Server obsahuje operátory OFFSET &NEXT pro implementaci stránkování. Operátor OFFSET posune dalších K počet výsledků hledání od začátku, zatímco operátor FETCH NEXT načte NEXT N výsledků, kde K a N jsou celá čísla.
Příprava fiktivních dat
Než uvidíme OFFSET FETCH NEXT v akci, vytvoříme fiktivní databázi s 200 záznamy. Můžete použít fungující databázi, pokud jste si 100% jisti, že je správně zálohována. Chcete-li to provést, spusťte následující skript:
CREATE Database ShowRoom; GO USE ShowRoom; CREATE TABLE Cars ( id INT PRIMARY KEY IDENTITY, name VARCHAR(50) NOT NULL, company VARCHAR(50) NOT NULL, power INT NOT NULL )
Ve výše uvedeném skriptu vytvoříme fiktivní databázi ShowRoom s jednou tabulkou nazvanou Cars. Pojďme do této databáze přidat nějaké fiktivní záznamy. Spusťte následující skript:
USE ShowRoom DECLARE @count INT SET @count = 1 DECLARE @carname VARCHAR (50) DECLARE @company_name VARCHAR (50) WHILE (@count <= 200) BEGIN SET @carname = 'Car - ' + LTRIM(@count) SET @company_name = 'Company - '+ LTRIM(@count) INSERT INTO Cars VALUES (@carname, @company_name, @count * 5) SET @count = @count + 1 END
Podívejte se pozorně na výše uvedený skript. Výše uvedený skript vloží 200 fiktivních záznamů do tabulky Cars. Skript používá smyčku while pro 200 iterací. Každá iterace připojí k číslu iterace slovo ‚Car -‘ a výsledek se vloží do sloupce názvu tabulky Cars. Podobně se ke slovu „Společnost -“ připojí číslo iterace a vloží se do sloupce společnosti v každé iteraci. Nakonec se s každou iterací číslo iterace vynásobí 5 a výsledek se vloží do sloupce výkonu. Pokud nyní vyberete všechny záznamy z tabulky Cars, uvidíte ve výsledkové sadě 200 záznamů. Chcete-li tak učinit, spusťte následující dotaz:
SELECT * FROM Cars
Snímek obrazovky s částečným výsledkem výše uvedeného dotazu je následující. Ve výsledku můžete vidět 200 řádků.
Příklad OFFSET FETCH NEXT
Nyní se podívejme na OFFSET NEXT v akci. Syntaxe OFFSET NEXT je následující:
SELECT * FROM Table_Name ORDER BY COLUMN_NAME/S OFFSET Number_of_rows_to_Skip ROWS FETCH NEXT Number_of_rows_to_Fetch ROWS ONLY
Zde je důležité zmínit, že musíte použít klauzuli ORDER BY s klauzulemi OFFSET FETCH NEXT.
Podívejme se na jednoduchý příklad OFFSET FETCH NEXT, kde seřadíme data podle sloupce id tabulky Cars, přeskočíme prvních 20 řádků a načteme dalších 10 řádků. Spusťte následující skript:
USE ShowRoom SELECT * FROM Cars ORDER BY id OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY
Ve výstupu skriptu výše uvidíte záznamy s hodnotou id 21 až 30, protože jsme přeskočili prvních 20 záznamů a načetli dalších 10.
Použití OFFSET FETCH NEXT s uloženou procedurou
Pokud implementujete stránkování v aplikaci front-end, jako je webová stránka nebo aplikace pro stolní počítače, obvykle odešlete hodnoty čísla stránky a velikosti stránky na server prostřednictvím uložené procedury. V závislosti na hodnotě čísla stránky a velikosti stránky vrátí uložená procedura správnou sadu řádků. Pojďme napsat takovou uloženou proceduru, která jako parametry vezme číslo stránky a velikost stránky a vrátí odpovídající záznamy.
Podívejte se na následující skript:
USE ShowRoom GO CREATE PROC spGetRecordsByPageAndSize @Page INT, @Size INT AS BEGIN SELECT * FROM Cars ORDER BY id OFFSET (@Page -1) * @Size ROWS FETCH NEXT @Size ROWS ONLY END
Ve výše uvedeném skriptu vytvoříme uloženou proceduru spGetRecordsByPageAndSize, která přebírá 2 parametry @Page a @Size. Uložená procedura používá OFFSET FETCH NEXT k filtrování záznamů podle počtu stránek a velikosti stránky. Pokud je například číslo stránky 2 a velikost 20, OFFSET bude:
(2 – 1) * 20 =20
A hodnota pro FETCH next bude rovna @Size, tj. 20. Proto budou vráceny záznamy s ID 21 až 40. Spuštěním výše uvedeného skriptu vytvořte uloženou proceduru.
Jakmile uloženou proceduru vytvoříte, spusťte následující skript, abyste viděli, co se vrátí, když je číslo stránky 2 a velikost stránky je 20.
EXECUTE spGetRecordsByPageAndSize 2, 20
Výstup výše uvedeného skriptu vypadá takto:
Podobně, pokud chcete načíst záznamy pro 4. stránku s 15 záznamy na stránku, následující dotaz načte záznamy od id 46 do id 60.
EXECUTE spGetRecordsByPageAndSize 4, 15
Výstup vypadá takto:
Závěr
OFFSET FETCH NEXT je mimořádně užitečný nástroj, zejména pokud chcete zobrazit velké množství záznamů seskupených do stránek. V tomto článku jsme viděli, jak se používá ve spojení s uloženou procedurou k implementaci stránkování na front-end aplikacích.