none
Consulta recursiva RRS feed

  • Pergunta

  •  

    Tenho a seguinte consulta

     

    Code Snippet

    WITH ConsultaRecursiva AS (SELECT categoriaId, categoriaPaiId, categoriaNome

    FROM tbProdutoCategoria AS Pai

    WHERE (categoriaId = @categoriaId)

    UNION ALL

    SELECT C.categoriaId, C.categoriaPaiId, C.categoriaNome

    FROM tbProdutoCategoria AS C INNER JOIN

    ConsultaRecursiva AS CR ON CR.categoriaId = C.categoriaPaiId)

    SELECT DISTINCT

    tbJuncaoProdutoCategoria.produtoId, tbProdutos.produtoPaiId, tbProdutos.produtoIdDaEmpresa, tbProdutos.produtoNome, tbProdutos.produtoPreco,

    tbProdutos.produtoPrecoPromocional, tbProdutos.produtoPrecoAtacado, tbProdutos.produtoLegendaAtacado, tbProdutos.produtoAtivo,

    tbProdutos.produtoFreteGratis, tbProdutos.produtoLancamento, tbProdutos.produtoPromocao, tbProdutos.produtoPrincipal, tbProdutos.produtoEstoqueAtual,

    tbProdutos.produtoEstoqueMinimo, tbProdutos.produtoUrl, tbProdutos.dataDaCriacao, (SELECT SUM(itemQuantidade) FROM tbItensPedido WHERE (produtoId = tbJuncaoProdutoCategoria.produtoId)) as itemQuantidade, isnull((SELECT top 1 categoriaId FROM tbJuncaoProdutoCategoria WHERE (produtoId = tbProdutos.produtoId)),0) categoriaId

    FROM ConsultaRecursiva AS ConsultaRecursiva_1 INNER JOIN

    tbJuncaoProdutoCategoria ON ConsultaRecursiva_1.categoriaId = tbJuncaoProdutoCategoria.categoriaId INNER JOIN

    tbProdutos ON tbJuncaoProdutoCategoria.produtoId = tbProdutos.produtoId

    WHERE (tbProdutos.produtoAtivo = 'True') AND (produtoNome collate SQL_Latin1_General_CP1_CI_AI LIKE '%'+@produtoNome+'%')

    ORDER BY tbProdutos.produtoNome

     

     

    Só que tem hora que me aparece o seguinte erro:

    The statement terminated. The maximum recursion 10000 has been exhausted before statement completion.

     

    Coloquei o option (maxrecursion 1000) mais também não resolveu.

     

    Alguém sabe oq fazer?

    Gustavo

    quinta-feira, 2 de outubro de 2008 13:33

Respostas

  • Olá Gustavo,

     

    Fora a mensagem de erro, há uma problema na sua consulta que o dificultará a conseguir a ajuda necessária e possivelmente a fazer a manutenção na mesma. Sempre que houver consultas muito complexas, você deve segmentá-la em consultas menores para que possamos focar especificamente no problema e não tentar desvendar as diversas linhas de código. Imagine a consulta abaixo:

     

    Code Snippet

    SELECT

    CAST(SUBSTRING(Data,20,6) + '01' AS SMALLDATETIME), Nome + ISNULL(SobreNome,'') + UltimoNome as NomeCompleto,

    REPLACE(REPLACE(REPLACE(LEFT(SUBSTRING(Codigo,15,3),5),'á','a'),'.',','),'R$','U$') * 100,

    CASE DAY(Data) WHEN 1 THEN 'Dia Primeiro de ' ELSE NULL END AS DiaPrimeiroFlag

    FROM

    tbl1,tbl2,tbl3,tbl4

    WHERE

    tbl1.id = tbl2.id and tbl2.codigo not in (select max(codigo) from tb5) and

    tbl3.id *= tbl4.id and LEFT(tbl3.codigo,2) = REPLACE(tbl5,'000000000','0') + '__' and

    tbl2.dtvencto in (select min(data) from tblDatas WHERE Ref = '200809')

     

     

    Se pudéssemos nos concentar no problema ao invés de visualizar toda essa poluição visual, com certeza o suporte seria muito mais eficiente. O recurso CTE permite essa divisão (não é preciso nem utilizar Views ou UDFs) e recomendo que a utilize (acredite, ficará bem mais fácil). Ex:

     

    Code Snippet

    WITH

    CTE1 AS (SELECT <Alguma Coisa> FROM <Algum Objeto>),

    CTE2 AS (SELECT <Alguma Coisa> FROM CTE1),

    CTE3 AS (SELECT <Alguma Coisa> FROM CTE2)

    SELECT <Campos> FROM CTE3

     

     

    Se você puder reescrever a sua consulta de forma a deixar o código mais legível e nos posicionar apenas para a questão da recursividade, posso tentar ajudá-lo. Já adianto que o MAX RECURSION não é a solução.

     

    [ ]s,

     

    Gustavo

     

     

    quinta-feira, 2 de outubro de 2008 14:17