none
Erro Maximum stored procedure, function, trigger, or view nesting level exceeded (limit 32) RRS feed

  • 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
    sábado, 17 de setembro de 2011 13:35

Respostas

  • Consegui resolver o problema refazendo a procedure... rs

    não retorno mais nada na procedure, e só faço o select depois da execução dela.

    ai deu certo!

    • Marcado como Resposta CaLopes segunda-feira, 7 de novembro de 2011 17:05
    segunda-feira, 7 de novembro de 2011 17:05

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]
    sábado, 17 de setembro de 2011 20:24
  • Consegui resolver o problema refazendo a procedure... rs

    não retorno mais nada na procedure, e só faço o select depois da execução dela.

    ai deu certo!

    • Marcado como Resposta CaLopes segunda-feira, 7 de novembro de 2011 17:05
    segunda-feira, 7 de novembro de 2011 17:05