Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Wdrażanie stronicowania za pomocą OFFSET FETCH NEXT w SQL Server

Baza danych może zawierać setki tysięcy rekordów. Wstawianie i wybieranie tych rekordów jest łatwe za pomocą systemów zarządzania bazami danych, takich jak SQL Server lub MySQL itp. Jednak wyświetlanie tysięcy rekordów na jednej stronie internetowej lub w aplikacji komputerowej nie jest łatwe. Ograniczenia przestrzeni i pamięci utrudniają jednoczesne wyświetlanie ogromnej liczby rekordów.

Częstym rozwiązaniem takiego problemu jest zaimplementowanie stronicowania. (Uwaga, nie jest to stronicowanie pamięci zaimplementowane przez systemy operacyjne) Stronicowanie w programowaniu odnosi się do wyświetlania danych za pośrednictwem serii stron. Losowe wyszukiwanie w Google może dać tysiące wyników. Google używa stronicowania do wyświetlania tych wyników. Jeśli przewiniesz stronę Google z wynikami wyszukiwania, zobaczysz:

Tutaj możesz zobaczyć liczbę stron, na które podzielony jest wynik wyszukiwania. Możesz kliknąć link Dalej, aby zobaczyć więcej stron.

W tym artykule zobaczymy, jak operatory OFFSET FETCH NEXT mogą być używane do implementacji stronicowania w aplikacjach typu front-end. Zaczniemy od prostego przykładu z użyciem operatora OFFSET FETCH NEXT, a następnie zobaczymy, jak można go praktycznie wykorzystać za pomocą procedury składowanej.

Używanie OFFSET FETCH NEXT do stronicowania w SQL Server

SQL Server zawiera operatory OFFSET i NEXT do implementacji stronicowania. Operator OFFSET przesuwa następną liczbę K wyników wyszukiwania od początku, podczas gdy operator FETCH NEXT pobiera NEXT wyników, gdzie K i N są liczbami całkowitymi.

Przygotowywanie fikcyjnych danych

Zanim zobaczymy w akcji OFFSET FETCH NEXT, stwórzmy fikcyjną bazę danych z 200 rekordami. Możesz użyć działającej bazy danych, jeśli masz 100% pewności, że jej kopia zapasowa jest prawidłowo utworzona. W tym celu wykonaj następujący skrypt:

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
)

W powyższym skrypcie tworzymy fikcyjną bazę danych ShowRoom z jedną tabelą o nazwie Samochody. Dodajmy kilka fikcyjnych rekordów w tej bazie danych. Wykonaj następujący skrypt:

 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

Przyjrzyj się uważnie powyższemu skryptowi. Powyższy skrypt wstawia 200 fikcyjnych rekordów do tabeli Samochody. Skrypt używa pętli while dla 200 iteracji. Każda iteracja dodaje słowo „Samochód -” do numeru iteracji, a wynik jest wstawiany do kolumny nazwy w tabeli Samochody. Podobnie słowo „Firma -” jest dołączane do numeru iteracji i wstawiane do kolumny firmy w każdej iteracji. Na koniec, z każdą iteracją, numer iteracji jest mnożony przez 5, a wynik jest wstawiany do kolumny potęgi. Teraz, jeśli wybierzesz wszystkie rekordy z tabeli Samochody, zobaczysz 200 rekordów w zestawie wyników. W tym celu wykonaj następujące zapytanie:

SELECT * FROM Cars

Zrzut ekranu częściowego wyniku powyższego zapytania jest następujący. Możesz zobaczyć 200 wierszy w wyniku.

FETCH FETCH NEXT Przykład

Teraz spójrzmy na OFFSET NEXT w akcji. Składnia OFFSET NEXT jest następująca:

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

Należy tutaj wspomnieć, że musisz użyć klauzuli ORDER BY z klauzulami OFFSET FETCH NEXT.

Zobaczmy prosty przykład OFFSET FETCH NEXT, w którym uporządkujemy dane według kolumny id tabeli Cars, pominiemy pierwsze 20 wierszy i pobierzemy kolejne 10 wierszy. Wykonaj następujący skrypt:

USE ShowRoom
SELECT * FROM Cars
ORDER BY id
OFFSET 20 ROWS
FETCH NEXT 10 ROWS ONLY

W wyniku powyższego skryptu zobaczysz rekordy o wartości identyfikatora od 21 do 30, ponieważ pominęliśmy pierwsze 20 rekordów i pobraliśmy następne 10.

Używanie OFFSET FETCH NEXT z procedurą zapisaną

Jeśli wdrażasz stronicowanie w aplikacji frontonu, takiej jak witryna internetowa lub aplikacja komputerowa, zazwyczaj wysyłasz wartości numeru i rozmiaru strony do serwera za pomocą procedury składowanej. W zależności od wartości numeru strony i rozmiaru strony procedura składowana zwróci poprawny zestaw wierszy. Napiszmy taką procedurę składowaną, która przyjmuje numer strony i rozmiar strony jako parametry i zwraca odpowiednie rekordy.

Spójrz na następujący skrypt:

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

W powyższym skrypcie tworzymy procedurę składowaną spGetRecordsByPageAndSize, która przyjmuje 2 parametry @Page i @Size. Procedura składowana używa OFFSET FETCH NEXT do filtrowania rekordów według liczby stron i rozmiaru strony. Na przykład, jeśli numer strony to 2, a rozmiar to 20, PRZESUNIĘCIE będzie wynosić:

(2 – 1) * 20 =20

A wartość dla FETCH next będzie równa @Size czyli 20. Dlatego zostaną zwrócone rekordy o identyfikatorach od 21 do 40. Wykonaj powyższy skrypt, aby utworzyć procedurę składowaną.
Po utworzeniu procedury składowanej wykonaj następujący skrypt, aby zobaczyć, co jest zwracane, gdy numer strony wynosi 2, a rozmiar strony wynosi 20.

EXECUTE spGetRecordsByPageAndSize 2, 20

Wynik powyższego skryptu wygląda tak:

Podobnie, jeśli chcesz pobrać rekordy dla czwartej strony z 15 rekordami na stronę, następujące zapytanie pobiera rekordy od id 46 do id 60.

EXECUTE spGetRecordsByPageAndSize 4, 15

Wynik działania wygląda tak:

Wniosek

OFFSET FETCH NEXT to niezwykle przydatne narzędzie, zwłaszcza jeśli chcesz wyświetlić dużą liczbę rekordów pogrupowanych w strony. W tym artykule zobaczyliśmy, jak jest on używany w połączeniu z procedurą składowaną do implementacji stronicowania w aplikacjach typu front-end.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SIGN() Przykłady w SQL Server

  2. Usuń konto pocztowe bazy danych z profilu (SSMS)

  3. SQL Server Standard Edition High Availability Futures

  4. Jak używać GROUP BY do łączenia ciągów w SQL Server?

  5. Nie można rozwiązać konfliktu sortowania między SQL_Latin1_General_CP1_CI_AS i Latin1_General_CI_AS w operacji równej