A recursão máxima 100 foi esgotada antes da conclusão da instrução

136

Eu continuo recebendo um max recursion errorcom esta consulta.

No começo, pensei que fosse porque um nulo estava sendo retornado e, em seguida, tentaria corresponder aos valores nulos que causavam o erro. No entanto, reescrevi minha consulta para que nulos não fossem retornados e o erro ainda ocorre.

Qual seria a melhor maneira de reescrever essa função, para que o erro não ocorra

WITH EmployeeTree AS
(
    SELECT 
        EMP_SRC_ID_NR Id, USR_ACV_DIR_ID_TE Uuid, 
        CASE Employees.APV_MGR_EMP_ID 
           WHEN Null THEN '0' 
           ELSE Employees.APV_MGR_EMP_ID 
        END as  ApprovalManagerId 
    FROM 
        dbo.[tEmployees] as Employees WITH (NOLOCK)
    WHERE 
        APV_MGR_EMP_ID = @Id 
        and Employees.APV_MGR_EMP_ID is not null 
        and Employees.EMP_SRC_ID_NR is not null  

    UNION ALL

    SELECT 
        EMP_SRC_ID_NR Id, USR_ACV_DIR_ID_TE Uuid, 
        CASE Employees.UPS_ACP_EMP_NR 
           WHEN Null THEN '1' 
           ELSE Employees.UPS_ACP_EMP_NR 
        END as ApprovalManagerId 
    FROM 
        dbo.[tEmployees] as Employees WITH (NOLOCK)
    WHERE 
        UPS_ACP_EMP_NR = @Id 
        and Employees.APV_MGR_EMP_ID is not null 
        and Employees.EMP_SRC_ID_NR is not null  

    UNION ALL

    SELECT 
        Employees.EMP_SRC_ID_NR, Employees.USR_ACV_DIR_ID_TE, 
        CASE Employees.APV_MGR_EMP_ID 
            WHEN Null THEN '2' 
            ELSE Employees.APV_MGR_EMP_ID 
        END  
    FROM 
        dbo.[tEmployees] as Employees WITH (NOLOCK)
    JOIN 
        EmployeeTree ON Employees.APV_MGR_EMP_ID = EmployeeTree.Id 
    where  
        Employees.APV_MGR_EMP_ID is not null 
        and Employees.EMP_SRC_ID_NR is not null             
)
SELECT 
    Id AS [EmployeeId], 
    Uuid AS [EmployeeUuid], 
    ApprovalManagerId AS [ManagerId] 
FROM EmployeeTree        
AJUDE-ME
fonte
Esta linha pode ser substituída por COALESCE(): CASE Employees.APV_MGR_EMP_ID WHEN Null THEN '0' ELSE Employees.APV_MGR_EMP_ID END as ApprovalManagerId=COALESCE(Employees.APV_MGR_EMP_ID, 0) AS ApprovalManagerID
David Faber

Respostas:

249

Especifique a opção maxrecursion no final da consulta:

...
from EmployeeTree
option (maxrecursion 0)

Isso permite que você especifique com que frequência o CTE pode se recuperar antes de gerar um erro. Maxrecursion 0 permite recursão infinita.

Andomar
fonte
1
hmm isso funcionou, mas a consulta retornou muito mais linhas do que deveria
HELP_ME
5
@bugz MAXRECURSION 0 faz agora afetar a sua consulta, você tem que olhar para o problema em outro lugar
t-clausen.dk
6
ahh era um refrence circular em meus dados, obrigado pela ajuda
HELP_ME
3
+1 Usei essa opção para depurar um problema semelhante. Se a consulta for infinitamente recursiva, você deverá cancelar a consulta no Management Studio após executá-la ou o servidor fará o spool de linhas até que o cliente fique sem memória.
Iain Samuel McLean Elder
1
Embora isso possa resolver o problema em situações nas quais você deseja que a consulta seja muito profunda, pode estar apenas ocultando um problema na consulta.
Christian Findlay
24

é apenas uma amostra para evitar erro máximo de recursão. nós temos que usar a opção (maxrecursion 365); ou opção (maxrecursion 0);

DECLARE @STARTDATE datetime; 
DECLARE @EntDt datetime; 
set @STARTDATE = '01/01/2009';  
set @EntDt = '12/31/2009'; 
declare @dcnt int; 
;with DateList as   
 (   
    select @STARTDATE DateValue   
    union all   
    select DateValue + 1 from    DateList      
    where   DateValue + 1 < convert(VARCHAR(15),@EntDt,101)   
 )   
  select count(*) as DayCnt from (   
  select DateValue,DATENAME(WEEKDAY, DateValue ) as WEEKDAY from DateList
  where DATENAME(WEEKDAY, DateValue ) not IN ( 'Saturday','Sunday' )     
  )a
option (maxrecursion 365);
Mou
fonte