sql >> Databáze >  >> RDS >> Sqlserver

Implementace stránkování pomocí OFFSET FETCH NEXT v SQL Server

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.


  1. Optimalizované SQL pro stromové struktury

  2. Funkce MySQL PI() – vrátí hodnotu π (pi)

  3. Jak COERCIBILITY() funguje v MariaDB

  4. Naformátujte číslo jako procento v MySQL