Usuário com melhor resposta
Erro Maximum stored procedure, function, trigger, or view nesting level exceeded (limit 32)

Pergunta
-
Bom dia,
Tenho uma procedure que está dando erro Maximum stored procedure, function, trigger, or view nesting level exceeded (limit 32). Nunca havia visto esse erro, andei procurando pelos foruns, entretanto não consegui solucionar o problema.
Se alguém puder dar uma forcinha:
ALTER PROCEDURE REL_ESTOQUEDISTRIB (@DATABASE DATETIME,
@LISTADISTRIB VARCHAR(200),
@LISTAPRODUTO VARCHAR(200))
AS
BEGIN
DECLARE @CNPJ VARCHAR(20),
@Codigo BIGINT,
@Nome VARCHAR(200),
@ProdCod BIGINT,
@EstNome VARCHAR(3),
@ProdValorFabrica MONEY,
@QtdMov NUMERIC(14,0),
@ProdNome VARCHAR(200),
@CliCod BIGINT
SELECT @CNPJ = '',
@Codigo = 0,
@Nome = '',
@ProdCod = 0,
@EstNome = '',
@ProdValorFabrica = 0.0,
@QtdMov = 0,
@ProdNome = '',
@CliCod = 0
DELETE FROM RELTAB_ESTOQUEDISTRIB
--Saída
DECLARE Cursor_PedidosIndireta CURSOR FOR
SELECT DISTINCT C.CliCNPJ, C.CliCod, C.CliNomeFantasia, PeI.ProdCod, E.EstNome, Prod.ProdValorFabrica, Prod.ProdNome
FROM dbo.Pedidos P WITH(NOLOCK)
INNER JOIN dbo.Clientes C WITH(NOLOCK)
ON P.CliCod = C.CliCod AND P.CliDtAlteracao = (SELECT MAX(C1.CliDtAlteracao) FROM Clientes C1 WHERE P.CliCod = C.CliCod)
INNER JOIN dbo.Estados E WITH(NOLOCK)
ON C.EstCod = E.EstCod
INNER JOIN dbo.PedidosItens PeI WITH(NOLOCK)
ON P.PedCod = PeI.PedCod AND P.PedDtAlteracao = PeI.PedDtAlteracao
INNER JOIN dbo.Produtos Prod WITH(NOLOCK)
ON PeI.ProdCod = Prod.ProdCod
WHERE CONVERT(VARCHAR(10), P.PedDtAlteracao, 103) <= CONVERT(VARCHAR(10), @DATABASE, 103)
AND P.PedDtAlteracao = (SELECT MAX(P2.PedDtAlteracao) FROM dbo.Pedidos P2 WHERE P.PedCod = P2.PedCod)
AND (P.CliCod IN (@LISTADISTRIB) OR @LISTADISTRIB IS NULL)
AND C.CliCNPJ IN (SELECT DistCNPJ FROM dbo.Distribuidores WHERE DistAtivo <> 0)
AND (PeI.ProdCod IN (@LISTAPRODUTO) OR @LISTAPRODUTO IS NULL)
AND P.TipoPedCod IN (SELECT T.TipoPedCod FROM TipoPedido T WHERE ISNULL(T.TipoPedAtivo, 1) <> 0 AND T.TipoPedVenda = 1)
AND P.PedStatus IN (5,6)
OPEN Cursor_PedidosIndireta
FETCH Cursor_PedidosIndireta INTO @CNPJ, @Codigo, @Nome, @ProdCod, @EstNome, @ProdValorFabrica, @ProdNome
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @QtdMov = SUM(PeI.PIQtdeFaturada)
FROM dbo.Pedidos P WITH(NOLOCK)
INNER JOIN dbo.PedidosItens PeI WITH(NOLOCK)
ON P.PedCod = PeI.PedCod AND P.PedDtAlteracao = PeI.PedDtAlteracao
INNER JOIN dbo.Produtos Prod WITH(NOLOCK)
ON PeI.ProdCod = Prod.ProdCod
WHERE P.PedDtAlteracao = (SELECT MAX(P2.PedDtAlteracao) FROM dbo.Pedidos P2 WHERE P.PedCod = P2.PedCod)
AND P.PedStatus IN (5,6)
AND P.CliCod = @Codigo
AND PeI.ProdCod = @ProdCod
AND CONVERT(VARCHAR(10), P.PedDtAlteracao, 103) <= CONVERT(VARCHAR(10), @DATABASE, 103)
AND P.TipoPedCod IN (SELECT T.TipoPedCod FROM TipoPedido T WHERE ISNULL(T.TipoPedAtivo, 1) <> 0 AND T.TipoPedVenda = 1)
INSERT INTO RELTAB_ESTOQUEDISTRIB
( Distribuidor , CNPJ , UF , Produto , ValorFabrica, QtdEntrada , ValEntrada , QtdSaida , ValSaida )
VALUES ( @Nome, @CNPJ, @EstNome, @ProdNome, @ProdValorFabrica, 0, 0, @QtdMov, @QtdMov * @ProdValorFabrica)
FETCH Cursor_PedidosIndireta INTO @CNPJ, @Codigo, @Nome, @ProdCod, @EstNome, @ProdValorFabrica, @ProdNome
END
CLOSE Cursor_PedidosIndireta
DEALLOCATE Cursor_PedidosIndireta
--Entrada
DECLARE Cursor_PedidosDireta CURSOR FOR
SELECT DISTINCT D.DistCNPJ, D.DistCod, D.DistNome, PeI.ProdCod, E.EstNome, Prod.ProdValorFabrica, Prod.ProdNome, P.CliCod
FROM dbo.Pedidos P WITH(NOLOCK)
INNER JOIN dbo.Distribuidores D WITH(NOLOCK)
ON P.DistCod = D.DistCod
INNER JOIN dbo.Estados E WITH(NOLOCK)
ON D.EstCod = E.EstCod
INNER JOIN dbo.PedidosItens PeI WITH(NOLOCK)
ON P.PedCod = PeI.PedCod AND P.PedDtAlteracao = PeI.PedDtAlteracao
INNER JOIN dbo.Produtos Prod WITH(NOLOCK)
ON PeI.ProdCod = Prod.ProdCod
WHERE CONVERT(VARCHAR(10), P.PedDtAlteracao, 103) <= CONVERT(VARCHAR(10), @DATABASE, 103)
AND P.PedDtAlteracao = (SELECT MAX(P2.PedDtAlteracao) FROM dbo.Pedidos P2 WHERE P.PedCod = P2.PedCod)
AND (D.DistCNPJ IN (SELECT C2.CliCNPJ FROM dbo.Clientes C2 WHERE CliCod IN (@LISTADISTRIB) AND C2.CliDtAlteracao = (SELECT MAX(CliDtAlteracao) FROM Clientes WHERE Clientes.CliCod = C2.CliCod) AND C2.CliAtivo <> 0)
OR @LISTADISTRIB IS NULL)
AND D.DistCNPJ IN (SELECT CliCNPJ FROM dbo.Clientes WHERE CliAtivo <> 0 AND CliDtAlteracao = (SELECT MAX(CliDtAlteracao) FROM Clientes C2 WHERE Clientes.CliCod = C2.CliCod))
AND (PeI.ProdCod IN (@LISTAPRODUTO) OR @LISTAPRODUTO IS NULL)
AND P.TipoPedCod IN (SELECT T.TipoPedCod FROM TipoPedido T WHERE ISNULL(T.TipoPedAtivo, 1) <> 0 AND T.TipoPedVenda = 0)
AND P.PedStatus IN (5,6)
OPEN Cursor_PedidosDireta
FETCH Cursor_PedidosDireta INTO @CNPJ, @Codigo, @Nome, @ProdCod, @EstNome, @ProdValorFabrica, @ProdNome, @CliCod
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @QtdMov = SUM(PeI.PIQtdeFaturada)
FROM dbo.Pedidos P WITH(NOLOCK)
INNER JOIN dbo.PedidosItens PeI WITH(NOLOCK)
ON P.PedCod = PeI.PedCod AND P.PedDtAlteracao = PeI.PedDtAlteracao
INNER JOIN dbo.Produtos Prod WITH(NOLOCK)
ON PeI.ProdCod = Prod.ProdCod
WHERE P.PedDtAlteracao = (SELECT MAX(P2.PedDtAlteracao) FROM dbo.Pedidos P2 WHERE P.PedCod = P2.PedCod)
AND P.PedStatus IN (5,6)
AND P.DistCod = @Codigo
AND PeI.ProdCod = @ProdCod
AND P.CliCod = @CliCod
AND CONVERT(VARCHAR(10), P.PedDtAlteracao, 103) <= CONVERT(VARCHAR(10), @DATABASE, 103)
AND P.TipoPedCod IN (SELECT T.TipoPedCod FROM TipoPedido T WHERE ISNULL(T.TipoPedAtivo, 1) <> 0 AND T.TipoPedVenda = 0)
INSERT INTO RELTAB_ESTOQUEDISTRIB
( Distribuidor , CNPJ , UF , Produto , ValorFabrica, QtdEntrada , ValEntrada , QtdSaida , ValSaida )
VALUES ( @Nome, @CNPJ, @EstNome, @ProdNome, @ProdValorFabrica, @QtdMov, @QtdMov * @ProdValorFabrica, 0, 0)
FETCH Cursor_PedidosDireta INTO @CNPJ, @Codigo, @Nome, @ProdCod, @EstNome, @ProdValorFabrica, @ProdNome, @CliCod
END
CLOSE Cursor_PedidosDireta
DEALLOCATE Cursor_PedidosDireta
SELECT Distribuidor, CNPJ, UF, Produto, ValorFabrica,
SUM(QtdEntrada) AS QtdEntrada,
SUM(QtdSaida) AS QtdSaida,
SUM(QtdEntrada) - SUM(QtdSaida) AS QtdEstoque,
(SUM(QtdEntrada) - SUM(QtdSaida)) * ValorFabrica AS ValEstoque
FROM RELTAB_ESTOQUEDISTRIB
GROUP BY Distribuidor, CNPJ, UF, Produto, ValorFabrica
ORDER BY Distribuidor
END
Grata, Camila Lopes
Respostas
Todas as Respostas
-
Camila,
O nível máximo para se trabalhar com qualquer objeto aninhado é o 32!!! Isso é um limite do SQL Server.
Você realmente precisa chegar até este nível de aninhamento? Talvez seja necessário dividir isso em outras procedures.
Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]- Editado Junior Galvão - MVPMVP sábado, 17 de setembro de 2011 20:24
-