Por Fabricio Ferreira
fabriciocarvalhoferreira@yahoo.com.br
Fabrício Ferreira é analista de sistemas e desenvolvedor no Grupo Habitasul, onde trabalha com SQL Server há 6 anos. Desenvolve projetos em .NET desde o Beta 1, sendo líder do primeiro grupo de usuários .NET do Rio Grande do Sul (GU-RS.NET)

Agrupamento de Procedures

Todo o desenvolvedor que já precisou trabalhar com stored procedures no SQL Server já deve ter se deparado com o problema do volume de procedures geradas para um sistema. São dezenas e dezenas de procedures (Consulta, Inserção, Exclusão, Atualização). Uma maneira muito interessante de reduzir a quantidade lógica de procedures é com a utilização do agrupamento de procedures.

 

Ao invés de criar dezenas de procedures, com diversos nomes, você pode criar um grupo lógico de procedures.

Por exemplo, você tem a seguinte consulta em uma SP:

  
     CREATE PROC UP_TotalPorCategoria ( @CodNatureza CHAR(1) ) 
     AS 
     SELECT C.NomeCategoria, S.NomeCategoria NomeSubCategoria, SUM(P.Valor) Total 
     FROM Pedidos P 
    JOIN Categoria S 
       ON P.CodCategoria = S.CodCategoria 
    JOIN Categoria C 
       ON S.CodCategoria Pai = C.CodCategoria 
 WHERE C.CodNatureza = @CodNatureza -- E, para entrada, S para saidas 
 GROUP BY C.NomeCategoria, S.NomeCategoria 
   
   

Depois, você precisaria de algo do tipo

     
     CREATE PROC UP_TotalGeralPorCategoria ( @CodNatureza CHAR(1) ) 
     AS 
     SELECT C.NomeCategoria, SUM(P.Valor) Total 
     FROM Pedidos P 
    JOIN Categoria S 
       ON P.CodCategoria = S.CodCategoria 
    JOIN Categoria C 
       ON S.CodCategoria Pai = C.CodCategoria 
 WHERE C.CodNatureza = @CodNatureza -- E, para entrada, S para saidas 
 GROUP BY C.NomeCategoria 
   
   

Ao invés de criar duas procedures com nomes diferentes você pode criar assim:

     
     CREATE PROC UP_TotalPorCategoria ;1 ( @CodNatureza CHAR(1) ) 
     AS 
     SELECT C.NomeCategoria, S.NomeCategoria NomeSubCategoria, SUM(P.Valor) Total 
     FROM Pedidos P 
    JOIN Categoria S 
       ON P.CodCategoria = S.CodCategoria 
    JOIN Categoria C 
       ON S.CodCategoria Pai = C.CodCategoria 
 WHERE C.CodNatureza = @CodNatureza -- E, para entrada, S para saidas 
 GROUP BY C.NomeCategoria, S.NomeCategoria 
 GO 
   
   CREATE PROC UP_TotalPorCategoria ;2 ( @CodNatureza CHAR(1) ) 
   AS 
   SELECT C.NomeCategoria, SUM(P.Valor) Total 
   FROM Pedidos P 
    JOIN Categoria S 
       ON P.CodCategoria = S.CodCategoria 
    JOIN Categoria C 
       ON S.CodCategoria Pai = C.CodCategoria 
 WHERE C.CodNatureza = @CodNatureza -- E, para entrada, S para saidas 
 GROUP BY C.NomeCategoria 
             

 

Observe o identificador que vem após o ponto e vírgula. Este identificador é quem informa ao SQL Server qual procedure que você vai utilizar em uma chamada. Ao criar procedures desta forma, apenas um GRANT é necessário para liberar o acesso de execução a um grupo de procedures. Ex.: GRANT EXEC ON UP_TotalPorCategoria TO usuarioSql

 

E, na hora de excluir a procedure, apenas um DROP remove todas elas:

 

DROP PROC UP_TotalPorCategoria 
     
 

Na hora de chamar, basta informar o identificador correto:


     
     // Valores aberto por sub-categoria 
     SqlCommand m_cmd = suaConnection.CreateCommand(); 
     m_cmd.CommandType = CommandType.StoredProcedure; 
     m_cmd.CommandText = " UP_TotalPorCategoria;1 "; 
     m_cmd.Parameters.Add( new SqlParameter("@CodNatureza", SqlDbType.Char, 1) ); 
     m_cmd.Parameters["@CodNatureza"].Value = 'E'; 
     ... 
     
     // Valores totalizados por categoria pai 
     SqlCommand m_cmd = suaConnection.CreateCommand(); 
     m_cmd.CommandType = CommandType.StoredProcedure; 
     m_cmd.CommandText = " UP_TotalPorCategoria;2 "; 
     m_cmd.Parameters.Add( new SqlParameter("@CodNatureza", SqlDbType.Char, 1) ); 
     m_cmd.Parameters["@CodNatureza"].Value = 'E'; 
     ... 
     
     Isto deve dar uma boa organizada em seus projetos. 
Dicas para quem está começando:
Veja os próximos eventos
que você não pode perder :

22/11/2008 SQL Launch -
Linhares - ES
Por : devASPNet


22/11/2008 SQL Launch- SQL Server 2008
Rio Paranaiba - Viçosa - MG
Por : devASPNet


22/11/2008 SQL Launch - SQL Server 2008
Volta Redonda - RJ
Por : devASPNet


22/11/2008 SQL Launch- SQL Server 2008
Franca - SP
Por : devASPNet


22/11/2008 SQL Launch - SQL Server 2008
Canoinhas - SC
Por : devASPNet


22/11/2008 SQL Launch - SQL Server 2008
Tefé - AM
Por : devASPNet


25/11/2008 SQL Launch - SQL Server 2008
Rio de Janeiro - RJ
Por : devASPNet


27/11/2008 SQL Lauch- SQL Server 2008
São Paulo - SP
Por : devASPNet


28/11/2008 SQL Launch - SQL Server 2008
São Paulo - SP
Por : devASPNet


29/11/2008 SQL Launch- SQL Server 2008
Pedro Leopoldo - MG
Por : devASPNet


29/11/2008 SQL Launch- SQL Server 2008
Petropolis - RJ
Por : devASPNet


29/11/2008 SQL Launch
Floriano - PI
Por : devASPNet


29/11/2008 SQL Launch - SQL Server 2008
Rio de Janeiro - RJ
Por : devASPNet


29/11/2008 SQL Launch - SQL Server 2008
Natal - RN
Por : devASPNet


29/11/2008 SQL Launch- SQL Server 2008
Santa Maria - RS
Por : devASPNet


29/11/2008 SQL Launch
Ituiutaba - MG
Por : devASPNet


5/12/2008 Cloud Computing e o Windows Azure
São Paulo - SP
Por : devASPNet


6/12/2008 SQL Server 2008 Community Launch
São Paulo - SP
Por : devASPNet

Leituras imperdíveis para quem está começando:

º Otimizando a performance no ASP.NET::..
º Criando objetos de paginação personalizados na grid::..
º Uma cesta de compras em ASP.NET::..
º Utilizando o Refresh de parâmetros no .NET::..
º ASP.NET FORMS Authentication::..
º Utilizando propriedades dinâmicas no .NET::..
º Corrigindo problemas de deleção em grid com paginação::..
º Cuidado com os componentes de validação::..
º Otimizando o InitializeComponent::..
º Movendo fonte de aplicações entre máquinas::..
º Agilizando a performance da IDE do VS.NET::..
º Utilizando Short Circuit no VB.NET::..


























  Parceiros:
20% de desconto para os membros do grupo na aquisição de livros e inscrição para eventos

Receba dicas de programação e programação .NET:
E-mail:
Incluir Excluir