Scenarie :
Du arbejder som SQL Server-udvikler med frontend-udviklingsteam. Frontend-teamet skal implementere paginering. Forvirret omkring sideinddeling? Intet problem. Tænk på at se dit kontoudtog eller kreditkortudtog. Hvor applikationer kun viser 10 eller 20 poster pr. side, og du skal klikke på næste for at se næste poster. Det kaldes paginering.Nu forstår du paginering, frontend-udviklingen har brug for SQL-forespørgsler fra dig, der kan bruges til returnerede påkrævede resultater, og de bør kunne sende sidenummer for at returnere poster.
Løsning:
Der er flere måder at skrive sideinddelingsforespørgsler på. En af dem er ved at bruge OFFSET FETCH-klausulen. Du skal sortere posterne, hvis du vil bruge OFFSET FETCH.Lad os oprette en dbo.TotalSale-tabel og indsætte nogle eksempelposter. Jeg har kun indsat 11 poster.
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) Lad os sige, hvis vi gerne vil springe de første 5 rækker over og ønsker at vise alle resten af rækkerne, vi kan bruge nedenfor forespørgslen.
Select [id], [SalePersonFName], [SalePersonLName], [ProductName], [ItemsSold], [SoldPrice] from dbo.TotalSale order by id OFFSET 5 rows
Sådan bruger du OFFSET FETCH-klausul i SQL Server til at springe de første X rækker over og vise alle resten af dem - SQL Server Tutorial |
2) Hvis vi nu gerne vil vise 3 poster pr. side, kan vi bruge nedenstående forespørgsel. I dette tilfælde skal vi vise første side
Select [id], [SalePersonFName], [SalePersonLName], [ProductName], [ItemsSold], [SoldPrice] from dbo.TotalSale order by id OFFSET 0 ROWS FETCH NEXT 3 ROWS ONLY;
Sådan bruges OFFSET FETCH-klausulen til at returnere poster pr. side i SQL Server - SQL Server-vejledning |
Bemærket at jeg har OFFSET 0, det betyder at jeg vil vise første side og med 3 rækker. Hvis jeg ønsker at vise anden side-poster, vil jeg indstille til OFFSET 1, ONLY Next 3 ROWS-delen vil forblive den samme som kun ønsker at vise 3 rækker pr. side.
Vi kan bruge variabler, så vi behøver ikke at foretage ændringer i forespørgslen, og ved at ændre værdien af variabler kan vi returnere vores ønskede resultater. Du kan oprette Stored Procedure, hvis du vil ved at bruge nedenstående forespørgsel.
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;
Hvis vi skal levere Stored Procedure til Front End-teamet, som accepterer sidetal og antal rækker, de gerne vil returnere for hver side, kan du bruge nedenfor til at oprette Stored Procedure.
Opret procedure 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
Lad os sige, at hvis vi gerne vil returnere anden side med 4 poster, kan vi bruge dbo.sp_GetSaleRecordsPerPage ved at angive nedenstående parameterværdier.
EXEC dbo.sp_GetSaleRecordsPerPage 2,4
Sådan udføres sideinddeling i SQL Server ved hjælp af OFFSET FETCH-klausul - TSQL-vejledning |