Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Filtrando por opções OFFSET-FETCH na consulta Select - SQL Server / TSQL Tutorial Part 118

Cenário:

Você está trabalhando como desenvolvedor do SQL Server com a equipe de desenvolvimento de front-end. A equipe de front-end precisa implementar a paginação. Confundir sobre paginação? Sem problemas. Pense em visualizar seu extrato bancário ou extrato de cartão de crédito. Onde os aplicativos mostram apenas 10 ou 20 registros por página e você tem que clicar próximo para ver os próximos registros. Isso se chama paginação.

Agora você entende de paginação, o desenvolvimento front-end precisa de consulta SQL de você que pode ser usado para retornar os resultados obrigatórios e devem ser capazes de passar o número da página para retornar os registros.


Solução:

Existem várias maneiras de escrever consultas de paginação, uma delas é usando a cláusula OFFSET FETCH. Você tem que ordenar os registros se quiser usar OFFSET FETCH.

Vamos criar a tabela dbo.TotalSale e inserir alguns registros de amostra. Eu inseri apenas 11 registros.

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'América do Norte' ), ( 2, N'M', N'Raza', N'Cell Phone', 2, 800, CAST(N'2015-07-15' AS DATE), N'Charlotte', N'NC', N'USA ', N'América do Norte' ), ( 3, N'Christy', N'Ladson', N'TV', 3, 1600, C AST(N'2015-04-02' AS DATE), N'High Point', N'NC', N'USA', N'América do Norte'), (4, N'John', N'Rivers', N'Laptop', 5, 2400, CAST(N'2014-03-09' AS DATE), N'Jersey City', N'NJ', N'USA', N'América do Norte' ), ( 5, N 'Najaf', N'Ali', N'Computer', 1, 300, CAST(N'2015-06-20' AS DATE), N'Karachi', N'Sindh', N'Paquistão', N'Asia ' ), ( 6, N'Sukhjeet', N'Singh', N'TV', 2, 900, CAST(N'2015-06-21' AS DATE), N'ChandiGar', N'Punjab', N 'Índia', 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'Paquistão', 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 'Portátil', 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'Alemanha', N'Europe' )
 
1) Digamos que queiramos pular as primeiras 5 linhas e mostrar todo o resto das linhas que podemos usar abaixo da consulta.

Selecione [id] , [SalePersonFName], [SalePersonLName], [ProductName], [ItemsSold], [SoldPrice] de dbo.TotalSale ordem por id OFFSET 5 linhas
Como usar a cláusula OFFSET FETCH no SQL Server para pular as primeiras X linhas e mostrar o restante delas - Tutorial do SQL Server

2) Agora, se quisermos mostrar 3 registros por página, podemos usar a consulta abaixo. Neste caso, vamos mostrar a primeira página

Selecione [id], [SalePersonFName], [SalePersonLName], [ProductName], [ItemsSold], [SoldPrice] do pedido dbo.TotalSale por id OFFSET 0 ROWS FETCH PRÓXIMAS 3 ROW ONLY;

Como usar a cláusula OFFSET FETCH para retornar registros por página no SQL Server - Tutorial do SQL Server

Percebi que tenho OFFSET 0, isso significa que quero mostrar a primeira página e com 3 linhas. Se eu quiser mostrar os registros da segunda página, definirei como OFFSET 1, a parte Next 3 ROWS ONLY permanecerá a mesma que deseja mostrar apenas 3 linhas por página.

Podemos usar variáveis ​​para que possamos não precisamos fazer alterações na consulta e alterando o valor das variáveis, podemos retornar nossos resultados necessários. Você pode criar um procedimento armazenado, se desejar, usando a consulta abaixo.

Declare @PageNumber intDeclare @RowsPerPage intset @RowsPerPage=3SET @PageNumber=1Select [id], [SalePersonFName], [SalePersonLName] , [ProductName], [ItemsSold], [SoldPrice] de dbo.TotalSale ordem por id OFFSET (@PageNumber-1)*@RowsPerPage ROWS FETCH NEXT @RowsPerPage ROWS ONLY;
 
Se precisarmos fornecer o procedimento armazenado para a equipe de front-end, que aceita o número da página e o número de linhas que eles gostariam de retornar para cada página, você pode usar abaixo para criar o procedimento armazenado.

Crie o procedimento dbo.sp_GetSaleRecordsPerPage
 @PageNumber int, @RowsPerPage intAS BEGINSelecione [id], [SalePersonFName], [SalePersonLName], [ProductName], [ItemsSold], [SoldPrice] de dbo.TotalSale order by id OFFSET (@PageNumber-1)*@RowsPerPage ROWS FETCH NEXT @RowsPerPage ROWS ONLY;END

Digamos que se quisermos retornar a segunda página com 4 registros, podemos usar o dbo.sp_GetSaleRecordsPerPage fornecendo os valores de parâmetro abaixo.

EXEC dbo.sp_GetSaleRecordsPerPage 2,4 
Como realizar paginação no SQL Server usando a cláusula OFFSET FETCH - Tutorial TSQL