| 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.