집 >데이터 베이스 >MySQL 튜토리얼 >재귀 CTE에서 SQL Server의 최대 재귀 오류를 해결하는 방법은 무엇입니까?
재귀 CTE에서 SQL Server 재귀 제한 극복
SQL Server에서 재귀 공통 테이블 표현식(CTE)으로 작업할 때 무서운 "최대 재귀 깊이 초과" 오류가 발생할 수 있습니다. 이는 중첩된 재귀 쿼리가 데이터베이스의 사전 정의된 제한을 초과할 때 발생합니다.
해결 방법은 maxrecursion
옵션을 사용하는 것입니다.
이 문제를 해결하기 위해 쿼리를 수정하는 방법은 다음과 같습니다.
<code class="language-sql">WITH EmployeeHierarchy AS ( SELECT EMP_SRC_ID_NR AS Id, USR_ACV_DIR_ID_TE AS Uuid, ISNULL(Employees.APV_MGR_EMP_ID, '0') 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 AS Id, USR_ACV_DIR_ID_TE AS Uuid, ISNULL(Employees.UPS_ACP_EMP_NR, '1') 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, ISNULL(Employees.APV_MGR_EMP_ID, '2') FROM dbo.[tEmployees] AS Employees WITH (NOLOCK) JOIN EmployeeHierarchy ON Employees.APV_MGR_EMP_ID = EmployeeHierarchy.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 EmployeeHierarchy OPTION (MAXRECURSION 0);</code>
OPTION (MAXRECURSION 0)
을 추가하면 재귀 제한을 효과적으로 제거하여 쿼리를 무기한 실행할 수 있습니다. 하지만 MAXRECURSION 0
을 사용할 때는 주의하세요. 성능 문제나 충돌로 이어질 수 있는 무한 루프를 방지하려면 CTE 논리가 올바른지 확인하세요. 재귀 깊이가 예기치 않게 큰 경우 대체 접근 방식을 고려하십시오. ISNULL
대신 CASE
을 사용하면 코드가 단순화되고 가독성이 향상됩니다.
위 내용은 재귀 CTE에서 SQL Server의 최대 재귀 오류를 해결하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!