명령문 완료 전에 최대 재귀 100이 소진되었습니다.


136

max recursion error이 쿼리를 계속 사용 합니다.

처음에는 null이 반환되고 오류가 발생하는 null 값과 일치하려고 시도했지만 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        

이 줄은 다음으로 대체 될 수 있습니다 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

답변:


249

쿼리 끝에 maxrecursion 옵션 을 지정하십시오 .

...
from EmployeeTree
option (maxrecursion 0)

이를 통해 오류를 생성하기 전에 CTE가 얼마나 자주 재귀 할 수 있는지 지정할 수 있습니다. Maxrecursion 0은 무한 재귀를 허용합니다.


1
흠 이것은 작동했지만 쿼리는 훨씬 더 많은 행을 반환했습니다
HELP_ME

5
@bugz Maxrecursion 0은 이제 쿼리에 영향을 미치므로 다른 곳에서 문제를 찾아야합니까
t-clausen.dk

6
ahh 도움을 주셔서 감사합니다.
HELP_ME

3
+1이 옵션을 사용하여 비슷한 문제를 디버깅했습니다. 쿼리가 무한 반복되는 경우 쿼리를 실행 한 후 Management Studio에서 쿼리를 취소해야합니다. 그렇지 않으면 클라이언트의 메모리가 부족해질 때까지 서버가 행을 스풀링합니다.
Iain Samuel McLean Elder

1
이렇게하면 쿼리가 매우 심하게 반복되는 상황에서 문제가 해결 될 수 있지만 쿼리에서 문제를 숨기는 것일 수 있습니다.
Christian Findlay

24

최대 재귀 오류를 피하기위한 샘플 일뿐입니다. 옵션 (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);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.