집 >데이터 베이스 >MySQL 튜토리얼 >SQL Recursive CTE의 '최대 재귀 100이 소진되었습니다' 오류를 어떻게 수정할 수 있습니까?
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!