Revisado em 01/2016
Este documento tem como objetivo exemplificar duas maneiras distintas de se aplicar paginação utilizando o MSSQL Server.
Objetivo:
Reproduzir as operações de paginação corretas, de acordo com a tabela a seguir:
Limite | Página 1 | Página 2 | Página 3 |
---|---|---|---|
20 | de 1 até 20 | de 21 até 40 | de 41 até 60 |
30 | de 1 até 30 | de 31 até 60 | de 61 até 90 |
Onde Limite é a quantidade de itens exibidos por página.
Calculando número de linhas
Sintaxe:
SELECT * FROM |
Desta maneira, o número atual da linha é retornado como uma coluna na tabela de resultados obtidos da sub-query. Isso permite a utilização dessa coluna para limitar os índices de início e fim dos resultados desejados.
Porém, utilizando essa abordagem, ainda é necessária a implementação de lógica para determinar esses valores, como demonstrado a seguir:
DECLARE @pagina1 INT = 3 |
Exemplo:
/* |
Uma “nova” abordagem
A “nova” abordagem se assemelha aos recursos já presentes em outros SGBDs há mais tempo, como MySql ou Postgres, onde é necessário apenas a utilização de um valor para o OFFSET (índice inicial de obtenção dos resultados) e LIMIT (quantidade de resultados obtidos por página).
Sintaxe:
SELECT * |
Embora ainda seja necessária a utilização de lógica para obtenção dos valores de OFFSET e LIMIT, a sintaxe dessa abordagem é muito mais limpa e intuitiva, otimizando o tempo gasto em futuras refatorações.
Porém, esse recurso só está disponível na versão 12 ou posteriores do MSSQL.
Exemplo:
A seguir, uma implementação do exemplo dado anteriormente utilizando a nova sintaxe.
DECLARE @pagina2 INT = 3 |
Conclusão
Os resultados obtidos nas duas queries de exemplo são equivalentes, exceto pelo fato de que na abordagem utilizando ROW_NUMBER() o número da linha é retornado como uma coluna extra na tabela de resultados.