복붙노트

[SQL] 최대 재귀 (100)는 문이 완료되기 전에 소진 된

SQL

최대 재귀 (100)는 문이 완료되기 전에 소진 된

나는이 쿼리 최대 재귀 오류가 계속.

처음에 나는 널이 반환되고 있었기 때문에 그것이 한 후 시도하고 null을 반환하고 오류가 계속 발생되지 않도록 오류가 있지만, 내 쿼리를 재 작성의 원인이 널 값과 일치 거라 생각 했어요.

어떻게하면 오류가 발생하지 않도록하는 것이,이 기능을 다시 작성하는 가장 좋은 방법이 될 것입니다

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        

해결법

  1. ==============================

    1.쿼리의 끝에서 MAXRECURSION 옵션을 지정합니다 :

    쿼리의 끝에서 MAXRECURSION 옵션을 지정합니다 :

    ...
    from EmployeeTree
    option (maxrecursion 0)
    

    즉 당신은 CTE가 오류를 생성하기 전에 재귀 횟수를 지정할 수 있습니다. MAXRECURSION 0은 무한 순환을 허용한다.

  2. ==============================

    2.최대 재귀 오류를 방지하기 위해 단지 샘플입니다. 우리가 사용하는 옵션 (MAXRECURSION 365)에있다; 또는 옵션 (MAXRECURSION 0);

    최대 재귀 오류를 방지하기 위해 단지 샘플입니다. 우리가 사용하는 옵션 (MAXRECURSION 365)에있다; 또는 옵션 (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);
    
  3. from https://stackoverflow.com/questions/9650045/the-maximum-recursion-100-has-been-exhausted-before-statement-completion by cc-by-sa and MIT license