Fehlerbehebung bei rekursiven SQL-CTE-Fehlern: Überschreitung des Rekursionslimits
SQL-Abfragen, die rekursive Common Table Expressions (CTEs) verwenden, stoßen häufig auf den Fehler „Maximale Rekursion 100 erschöpft“. Dies tritt auf, wenn die rekursiven Aufrufe des CTE das Standard-Rekursionslimit (normalerweise 100) überschreiten.
Rekursive CTE-Fehler durch Ändern der Abfrage beheben
Lassen Sie uns anhand eines Beispiels das Abrufen von Mitarbeiterdaten und ihren hierarchischen Genehmigungsmanagern veranschaulichen:
<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>
Die Lösung beinhaltet die OPTION (MAXRECURSION)
-Klausel:
<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>
Diese Klausel steuert die Rekursionstiefe des CTE. Wenn Sie MAXRECURSION
auf 0 setzen, wird das Rekursionslimit deaktiviert und der Fehler effektiv verhindert. Es ist jedoch Vorsicht geboten: Eine unendliche Rekursion kann zu Leistungsproblemen oder Abstürzen führen, wenn die hierarchischen Daten falsch strukturiert sind oder Zirkelverweise enthalten. Überprüfen Sie Ihre Daten und die CTE-Logik sorgfältig, um sicherzustellen, dass sie korrekt beendet wird, bevor Sie MAXRECURSION 0
verwenden. Eine robustere Lösung könnte darin bestehen, MAXRECURSION
auf einen höheren, aber endlichen Wert zu setzen oder die Daten auf mögliche Endlosschleifen zu analysieren.
Das obige ist der detaillierte Inhalt vonWie kann ich den Fehler „Die maximale Rekursion von 100 wurde ausgeschöpft' in rekursiven SQL-CTEs beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!