Build Brasil
Treinamentos FCamara
Paginação no SQL Server

Olá a todos,

Começarei esse artigo com a seguinte pergunta: "Por que fazer paginação no SQL, se é tão mais fácil no Visual Studio?Mas por que????". A resposta é simples, utilizando essa forma, voce notará uma significante melhora na performance. Vamos ao código:

/* Variáveis para controle das páginas */
DECLARE @PageNumber INT;
DECLARE @PageSize INT;
DECLARE @TotalPages INT;

/* Quantas linha por página */
SET @PageSize = 15;

SET @PageNumber = 3;

    IF @PageNumber = 0 BEGIN
        SET @PageNumber = 1
    END;

    /* Usamos WITH para criar uma tabela temporária, quando os mesmos campos que queremos inserir, e  mais leve do que quando utilizamos #. 
     * O único problema dela é que só podemos dar um SELECT nela.
     */
    WITH Cadastro([NumeroLinha], [Nome], [Endereco], [Telefone], [Email])
      AS (
    /* A função do ROW_NUMBER() só funciona com a cláusula WITH e somente no SQL Server 2005*/
      SELECT ROW_NUMBER() OVER (ORDER BY [ID] ASC) AS [NumeroLinha]
             ,[Nome]
             ,[Endereco]
             ,[Telefone]
             ,[Email]
        FROM [dbo].[Cadastrados] (NOLOCK)
        )

/* Executo um SELECT para me retornar a pagina e as linhas que a compõem */
        SELECT [NumeroLinha], [Nome], [Endereco], [Telefone], [Email]
          FROM Cadastro
         WHERE [NumeroLinha] 
       BETWEEN ( ( ( @PageNumber - 1 ) * @PageSize ) + 1 ) 
	  AND ( @PageNumber * @PageSize )

/* Obtenho o total de páginas */
    SET @TotalPages = CEILING(CONVERT(NUMERIC(20,10), ISNULL((SELECT COUNT(*) 
                                                 		FROM [dbo].[Cadastrados] (NOLOCK)), 0)) / @PageSize)

Darei todos os créditos desse artigo a um amigo meu de trabalho, chamado Marcos Sabino Filho, ele ia chorar se eu não falasse dele nesse post, agora esta aí, agradeço muito a você por mais esse "pedaço" de conhecimento que você compartilhou comigo. O cara é tão cabeça, que não aceita a idéia de criar um blog e colocar seu conhecimento lá! Eu já disse a ele que o blog dele seria uns dos mais visitados, por que o cara sabe explicar muito bem as coisas, é impressionante!! Mais uma vez, muito obrigado, e pare de choramingar!

 


Posted 13 Jun 2009 13:30 by Abdul Hade

Comments

Wander Junior wrote re: Paginação no SQL Server
on 8 Dec 2009 1:24

Olá,

estava olhando agumas soluções de paginação na net, para ver se era possível substituir a minha, por algo com mais performace. Porem em todos os sites e foruns que visito, as soluções usadas são semelhantes.

mas gostaria de fazer algunas considerações na solução que você postou aqui.

Você teria maior perfomace se trocasse count(*) por count(1) por exmplo,

Não vejo razão pra tantas conversões CEILING(CONVERT(NUMERIC(20,10),

e a solução postada só seria válida para sql2005 ou superior ao passo que se utilizar uma temporaria normal #temp com uma coluna identity(1,1) você teria a mesma numeração de linha e valeria para outras versão do sql, esta ultima consideração estou levando em conta os desenvolvedores que ainda tem cliente usando o SQL 2000, que é o meu caso.

atenciosamente

Wander Junior

Copyright© Build Brasil 2004 - 2009 - Todos os Direitos Reservados
Powered by Community Server (Commercial Edition), by Telligent Systems