Atualmente executamos duas consultas para obter a contagem e o resultado com um filtro de paginação. Embora possamos facilmente combinar ambos em uma única chamada de rede (usando separadores sql), existe uma maneira de fazer isso em uma única consulta seguindo o princípio DRY ?
-- count
SELECT COUNT(*) FROM table;
-- result with pagination
SELECT *
FROM (SELECT ROW_NUMBER() OVER (ORDER BY tbl.idn) AS row, * FROM tbl)_tbl
WHERE row >= 1 AND row <= 10;
É realmente desafiador manter ambas as consultas - uma única consulta reduz a sobrecarga de manutenção.
Você pode tentar criar um procedimento armazenado e chamá-lo do aplicativo.
Ou você pode usar a subconsulta:
Editar.
Melhor ainda, você pode usar
OFFSET FETCH
a cláusula para paginação puprose. Você obterá um código muito mais limpo e maior desempenho (sem função de janela aqui). Por exemplo algo assim:Ou com subconsulta:
Não há diferença significativa entre uma subconsulta e uma abordagem variável. É mais sobre a notação. O SQL Server faz quase o mesmo trabalho (loop aninhado "nocost" adicional). Nesta situação específica, prefiro evitar a função de janela (possível Table Spool - impacto adicional no tempdb).