Um banco de dados pode ter centenas de milhares de registros. É fácil inserir e selecionar esses registros por meio de sistemas de gerenciamento de banco de dados como SQL Server ou MySQL etc. No entanto, não é fácil exibir milhares de registros em uma única página da Web ou em um aplicativo de desktop. As restrições de espaço e memória dificultam a exibição de um grande número de registros de uma só vez.
Uma solução comum para esse problema é implementar a paginação. (Observe que isso não é paginação de memória implementada por sistemas operacionais) Paginação na programação refere-se à exibição de dados por meio de uma série de páginas. Uma pesquisa aleatória no Google pode resultar em milhares de resultados. O Google usa paginação para exibir esses resultados. Se você rolar a página do Google com os resultados da pesquisa, verá o seguinte:
Aqui você pode ver o número de páginas em que o resultado da pesquisa está dividido. Você pode clicar no link Avançar para ver mais páginas.
Neste artigo, veremos como os operadores OFFSET FETCH NEXT podem ser usados para implementar a paginação em aplicativos front-end. Começaremos com um exemplo simples usando o operador OFFSET FETCH NEXT e veremos como ele pode ser usado na prática com a ajuda de um procedimento armazenado.
Usando OFFSET FETCH NEXT para paginação no SQL Server
O SQL Server contém os operadores OFFSET &NEXT para implementar a paginação. O operador OFFSET desloca o próximo número K de resultados da pesquisa desde o início, enquanto o operador FETCH NEXT busca os resultados NEXT N onde K e N são inteiros.
Preparando dados fictícios
Antes de vermos OFFSET FETCH NEXT em ação, vamos criar um banco de dados fictício com 200 registros. Você pode usar um banco de dados em funcionamento se estiver 100% confiante de que o backup foi feito corretamente. Execute o seguinte script para fazer isso:
CREATE Database ShowRoom; GO USE ShowRoom; CREATE TABLE Cars ( id INT PRIMARY KEY IDENTITY, name VARCHAR(50) NOT NULL, company VARCHAR(50) NOT NULL, power INT NOT NULL )
No script acima criamos um banco de dados fictício ShowRoom com uma tabela chamada Cars. Vamos adicionar alguns registros fictícios neste banco de dados. Execute o seguinte script:
USE ShowRoom DECLARE @count INT SET @count = 1 DECLARE @carname VARCHAR (50) DECLARE @company_name VARCHAR (50) WHILE (@count <= 200) BEGIN SET @carname = 'Car - ' + LTRIM(@count) SET @company_name = 'Company - '+ LTRIM(@count) INSERT INTO Cars VALUES (@carname, @company_name, @count * 5) SET @count = @count + 1 END
Dê uma olhada cuidadosa no script acima. O script acima insere 200 registros fictícios na tabela Carros. O script usa um loop while para 200 iterações. Cada iteração acrescenta a palavra ‘Car -’ ao número da iteração e o resultado é inserido na coluna de nome da tabela Carros. Da mesma forma, a palavra “Empresa -” é anexada ao número da iteração e é inserida na coluna da empresa em cada iteração. Finalmente, a cada iteração, o número da iteração é multiplicado por 5 e o resultado é inserido na coluna de potência. Agora, se você selecionar todos os registros da tabela Carros, verá 200 registros no conjunto de resultados. Execute a seguinte consulta para fazer isso:
SELECT * FROM Cars
A captura de tela do resultado parcial da consulta acima é a seguinte. Você pode ver 200 linhas no resultado.
Exemplo de BUSCA DE DESLOCAMENTO PRÓXIMO
Agora vamos ver o OFFSET NEXT em ação. A sintaxe de OFFSET NEXT é a seguinte:
SELECT * FROM Table_Name ORDER BY COLUMN_NAME/S OFFSET Number_of_rows_to_Skip ROWS FETCH NEXT Number_of_rows_to_Fetch ROWS ONLY
É importante mencionar aqui que você deve usar a cláusula ORDER BY com as cláusulas OFFSET FETCH NEXT.
Vamos ver um exemplo simples de OFFSET FETCH NEXT onde vamos ordenar os dados pela coluna id da tabela Cars, pular as primeiras 20 linhas e buscar as próximas 10 linhas. Execute o seguinte script:
USE ShowRoom SELECT * FROM Cars ORDER BY id OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY
Na saída do script acima, você verá registros com um valor de id de 21 a 30, pois pulamos os primeiros 20 registros e buscamos os próximos 10.
Usando OFFSET FETCH NEXT com Stored Procedure
Se você estiver implementando a paginação em um aplicativo de front-end, como um site ou um aplicativo de desktop, normalmente enviará valores de número de página e tamanho de página para o servidor por meio de um procedimento armazenado. Dependendo do valor do número da página e do tamanho da página, o procedimento armazenado retornará o conjunto correto de linhas. Vamos escrever um procedimento armazenado que receba o número da página e o tamanho da página como parâmetros e retorne os registros correspondentes.
Dê uma olhada no script a seguir:
USE ShowRoom GO CREATE PROC spGetRecordsByPageAndSize @Page INT, @Size INT AS BEGIN SELECT * FROM Cars ORDER BY id OFFSET (@Page -1) * @Size ROWS FETCH NEXT @Size ROWS ONLY END
No script acima, criamos um procedimento armazenado spGetRecordsByPageAndSize que recebe 2 parâmetros @Page e @Size. O procedimento armazenado usa OFFSET FETCH NEXT para filtrar registros por um número de páginas e tamanho de página. Por exemplo, se o número da página for 2 e o tamanho for 20, o OFFSET será:
(2 – 1) * 20 =20
E o valor para FETCH next será igual ao @Size, ou seja, 20. Portanto, os registros com id 21 a 40 serão retornados. Execute o script acima para criar um procedimento armazenado.
Depois de criar o procedimento armazenado, execute o script a seguir para ver o que é retornado quando o número da página é 2 e o tamanho da página é 20.
EXECUTE spGetRecordsByPageAndSize 2, 20
A saída do script acima é assim:
Da mesma forma, se você deseja recuperar os registros da 4ª página com 15 registros por página, a consulta a seguir recupera os registros do id 46 ao id 60.
EXECUTE spGetRecordsByPageAndSize 4, 15
A saída de se parece com isso:
Conclusão
OFFSET FETCH NEXT é uma ferramenta extremamente útil, principalmente se você deseja exibir um grande número de registros agrupados em páginas. Neste artigo, vimos como ele é usado em conjunto com um procedimento armazenado para implementar a paginação em aplicativos front-end.