Scenariusz:
Pracujesz jako programista SQL Server z zespołem programistów front-end.Zespół front-end musi zaimplementować paginację. Nie rozumiesz paginacji? Nie ma problemu. Pomyśl o przejrzeniu wyciągu bankowego lub wyciągu z karty kredytowej. Aplikacje wyświetlają tylko 10 lub 20 rekordów na stronie i musisz kliknąć przycisk Dalej, aby zobaczyć następne rekordy. Nazywa się to paginacją.Teraz rozumiesz paginację, programowanie front-end wymaga zapytania SQL, które może być używane do zwracania wymaganych wyników i powinny być w stanie przekazać numer strony w celu zwrócenia rekordów.
Rozwiązanie:
Istnieje wiele sposobów pisania zapytań o paginację, jednym z nich jest użycie klauzuli OFFSET FETCH. Musisz posortować rekordy, jeśli chcesz użyć OFFSET FETCH.Stwórzmy tabelę dbo.TotalSale i wstawmy kilka przykładowych rekordów. Wstawiłem tylko 11 rekordów.
CREATE TABLE [dbo].[TotalSale]
(
[id] [int] NOT NULL ,
[SalePersonFName] [varchar](100) NULL ,
[SalePersonLName] [varchar](100) NULL ,
[ProductName] [varchar](100) NULL ,
[ItemsSold] [int] NULL ,
[SoldPrice] [float] NULL ,
[SoldDate] [date] NULL ,
[City] [varchar](100) NULL ,
[State] [varchar](100) NULL ,
[Country] [varchar](100) NULL ,
[Region] [varchar](100) NULL
)
INSERT [dbo].[TotalSale]
( [id], [SalePersonFName], [SalePersonLName], [ProductName],
[ItemsSold], [SoldPrice], [SoldDate], [City], [State], [Country],
[Region] )
VALUES ( 1, N'Aamir', N'Shahzad', N'TV', 1, 700, CAST(N'2015-07-15' AS DATE),
N'Charlotte', N'NC', N'USA', N'North America' )
, ( 2, N'M', N'Raza', N'Cell Phone', 2, 800, CAST(N'2015-07-15' AS DATE),
N'Charlotte', N'NC', N'USA', N'North America' )
, ( 3, N'Christy', N'Ladson', N'TV', 3, 1600,
CAST(N'2015-04-02' AS DATE), N'High Point', N'NC', N'USA',
N'North America' )
, ( 4, N'John', N'Rivers', N'Laptop', 5, 2400,
CAST(N'2014-03-09' AS DATE), N'Jersey City', N'NJ', N'USA',
N'North America' )
, ( 5, N'Najaf', N'Ali', N'Computer', 1, 300,
CAST(N'2015-06-20' AS DATE), N'Karachi', N'Sindh', N'Pakistan',
N'Asia' )
, ( 6, N'Sukhjeet', N'Singh', N'TV', 2, 900, CAST(N'2015-06-21' AS DATE),
N'ChandiGar', N'Punjab', N'India', N'Asia' )
, ( 7, N'Chirag', N'Patel', N'Cell Phone', 5, 1500,
CAST(N'2015-06-23' AS DATE), N'AhmadAbad', N'Gujrat', N'India',
N'Asia' )
, ( 8, N'Aleena', N'Aman', N'Laptop', 2, 800,
CAST(N'2015-05-25' AS DATE), N'Lahore', N'Punjab', N'Pakistan',
N'Asia' )
, ( 9, N'Petra', N'Henry', N'TV', 10, 5000, CAST(N'2015-04-08' AS DATE),
N'Paris', N'Île-de-France', N'France', N'Europe' )
, ( 10, N'Rita', N'Roger', N'Laptop', 7, 2100,
CAST(N'2015-04-11' AS DATE), N'Paris', N'Île-de-France', N'France',
N'Europe' )
, ( 11, N'Tamara', N'Tony', N'Cell Phone', 2, 1200,
CAST(N'2015-03-03' AS DATE), N'Frankfurt', N'Hesse', N'Germany',
N'Europe' ) 1) Załóżmy, że chcemy pominąć pierwsze 5 wierszy i wyświetlić wszystkie pozostałe wiersze, których możemy użyć w zapytaniu.
Select
[id], [SalePersonFName], [SalePersonLName], [ProductName],
[ItemsSold], [SoldPrice]
from dbo.TotalSale
order by id
OFFSET 5 rows ![]() |
| Jak używać klauzuli OFFSET FETCH w SQL Server, aby pominąć pierwsze X wierszy i wyświetlić wszystkie pozostałe — samouczek SQL Server |
2) Teraz, jeśli chcielibyśmy pokazać 3 rekordy na stronie, możemy użyć poniższego zapytania. W tym przypadku pokażemy pierwszą stronę
Select
[id], [SalePersonFName], [SalePersonLName], [ProductName],
[ItemsSold], [SoldPrice]
from dbo.TotalSale
order by id
OFFSET 0 ROWS FETCH NEXT 3 ROWS ONLY; ![]() |
| Jak używać klauzuli OFFSET FETCH do zwracania rekordów na stronę w SQL Server — samouczek SQL Server |
Zauważyłem, że mam PRZESUNIĘCIE 0, co oznacza, że chcę pokazać pierwszą stronę z 3 wierszami. Jeśli chcę pokazać rekordy drugiej strony, ustawię na PRZESUNIĘCIE 1, część TYLKO NASTĘPNE 3 WIERSZE pozostanie taka sama, jak chcę pokazać tylko 3 wiersze na stronę.
Możemy użyć zmiennych, więc możemy nie musimy wprowadzać zmian w zapytaniu, a zmieniając wartości zmiennych, możemy zwrócić wymagane przez nas wyniki. Możesz utworzyć procedurę składowaną, jeśli chcesz, korzystając z poniższego zapytania.
Declare @PageNumber int
Declare @RowsPerPage int
set @RowsPerPage=3
SET @PageNumber=1
Select
[id], [SalePersonFName], [SalePersonLName], [ProductName],
[ItemsSold], [SoldPrice]
from dbo.TotalSale
order by id
OFFSET (@PageNumber-1)*@RowsPerPage ROWS FETCH NEXT @RowsPerPage ROWS ONLY; Jeśli musimy udostępnić procedurę składowaną zespołowi Front End, który akceptuje numer strony i liczbę wierszy, które chcieliby zwrócić dla każdej strony, możesz użyć poniższej procedury, aby utworzyć procedurę składowaną.
Utwórz procedurę dbo.sp_GetSaleRecordsPerPage
@PageNumber int,
@RowsPerPage int
AS
BEGIN
Select
[id], [SalePersonFName], [SalePersonLName], [ProductName],
[ItemsSold], [SoldPrice]
from dbo.TotalSale
order by id
OFFSET (@PageNumber-1)*@RowsPerPage
ROWS FETCH NEXT @RowsPerPage ROWS ONLY;
END Powiedzmy, że jeśli chcemy zwrócić drugą stronę z 4 rekordami, możemy użyć dbo.sp_GetSaleRecordsPerPage podając poniższe wartości parametrów.
EXEC dbo.sp_GetSaleRecordsPerPage 2,4
![]() |
| Jak wykonać stronicowanie w SQL Server przy użyciu klauzuli OFFSET FETCH — samouczek TSQL |


