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 |