Scenario:
Je werkt als SQL Server-ontwikkelaar met een front-end ontwikkelteam. Het front-endteam moet paginering implementeren. Verwarring over paginering? Geen probleem. Denk aan het inzien van uw bankafschrift of creditcardafschrift. Waar applicaties slechts 10 of 20 records per pagina tonen en je op volgende moet klikken om de volgende records te zien. Dat wordt paginering genoemd. worden gebruikt om de vereiste resultaten te retourneren en ze moeten het paginanummer kunnen doorgeven om records te retourneren.Oplossing:
Er zijn meerdere manieren om pagineringsquery's te schrijven. Een daarvan is door de OFFSET FETCH-clausule te gebruiken. U moet de records sorteren als u OFFSET FETCH wilt gebruiken.Laten we een dbo.TotalSale-tabel maken en enkele voorbeeldrecords invoegen. Ik heb slechts 11 records ingevoegd.
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) Stel dat we de eerste 5 rijen willen overslaan en alle overige rijen willen tonen die we onder de query kunnen gebruiken.
Select [id], [SalePersonFName], [SalePersonLName], [ProductName], [ItemsSold], [SoldPrice] from dbo.TotalSale order by id OFFSET 5 rows
Hoe de OFFSET FETCH-clausule in SQL Server te gebruiken om de eerste X-rijen over te slaan en de rest ervan weer te geven - SQL Server-zelfstudie |
2) Als we nu 3 records per pagina willen tonen, kunnen we onderstaande query gebruiken. In dit geval tonen we de eerste pagina
Select [id], [SalePersonFName], [SalePersonLName], [ProductName], [ItemsSold], [SoldPrice] from dbo.TotalSale order by id OFFSET 0 ROWS FETCH NEXT 3 ROWS ONLY;
Hoe de OFFSET FETCH-clausule te gebruiken om records per pagina in SQL Server te retourneren - SQL Server-zelfstudie |
Merk op dat ik OFFSET 0 heb, dat betekent dat ik de eerste pagina wil tonen en met 3 rijen. Als ik records op de tweede pagina wil weergeven, stel ik OFFSET 1 in, het gedeelte ALLEEN Volgende 3 RIJEN blijft hetzelfde en wil slechts 3 rijen per pagina tonen.
We kunnen variabelen gebruiken, zodat we hoeven geen wijzigingen in de query aan te brengen en door de waarde van variabelen te wijzigen, kunnen we onze vereiste resultaten retourneren. U kunt desgewenst een Stored Procedure maken met behulp van onderstaande query.
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;
Als we een Stored Procedure moeten leveren aan het Front End-team, dat het paginanummer en het aantal rijen dat ze voor elke pagina willen retourneren accepteert, kunt u hieronder de Stored Procedure gebruiken.
Procedure aanmaken 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
Stel dat als we de tweede pagina met 4 records willen retourneren, we de dbo.sp_GetSaleRecordsPerPage kunnen gebruiken door onderstaande parameterwaarden op te geven.
EXEC dbo.sp_GetSaleRecordsPerPage 2,4
Paginering in SQL Server uitvoeren met behulp van de OFFSET FETCH-clausule - TSQL-zelfstudie |