>데이터 베이스 >MySQL 튜토리얼 >SQL Recursive CTE의 '최대 재귀 100이 소진되었습니다' 오류를 어떻게 수정할 수 있습니까?

SQL Recursive CTE의 '최대 재귀 100이 소진되었습니다' 오류를 어떻게 수정할 수 있습니까?

Susan Sarandon
Susan Sarandon원래의
2025-01-10 07:10:41185검색

How Can I Fix

SQL 재귀 CTE 오류 문제 해결: 재귀 제한 초과

재귀 공통 테이블 표현식(CTE)을 사용하는 SQL 쿼리에서는 종종 "최대 재귀 100이 소진되었습니다" 오류가 발생합니다. 이는 CTE의 재귀 호출이 기본 재귀 제한(일반적으로 100)을 초과할 때 발생합니다.

쿼리 수정을 통한 반복적 CTE 오류 해결

직원 데이터 및 계층적 승인 관리자를 검색하는 예를 들어 설명하겠습니다.

<code class="language-sql">WITH EmployeeTree AS (
    -- Anchor member of the CTE (initial query)
    ...
    UNION ALL
    SELECT 
        Employees.EMP_SRC_ID_NR, Employees.USR_ACV_DIR_ID_TE, 
        ISNULL(Employees.APV_MGR_EMP_ID, '2')  -- Simplified NULL handling
    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        </code>

해결책에는 OPTION (MAXRECURSION) 절이 포함됩니다.

<code class="language-sql">WITH EmployeeTree AS (
    -- Anchor member of the CTE (initial query)
    ...
    UNION ALL
    SELECT ...
    FROM ...
    JOIN EmployeeTree ON ...
)
OPTION (MAXRECURSION 0)
SELECT ...
FROM EmployeeTree        </code>

이 절은 CTE의 재귀 깊이를 제어합니다. MAXRECURSION을 0으로 설정하면 재귀 제한이 비활성화되어 오류를 효과적으로 방지할 수 있습니다. 그러나 주의하는 것이 좋습니다: 계층적 데이터가 부적절하게 구조화되었거나 순환 참조가 포함된 경우 무한 재귀는 성능 문제나 충돌을 일으킬 수 있습니다. MAXRECURSION 0을 사용하기 전에 데이터와 CTE 로직을 주의 깊게 검토하여 올바르게 종료되는지 확인하세요. 보다 강력한 솔루션에는 MAXRECURSION을 더 높지만 유한한 값으로 설정하거나 잠재적인 무한 루프에 대해 데이터를 분석하는 것이 포함될 수 있습니다.

위 내용은 SQL Recursive CTE의 '최대 재귀 100이 소진되었습니다' 오류를 어떻게 수정할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.