Überwindung des SQL Server-Rekursionslimits in rekursiven CTEs
Beim Arbeiten mit rekursiven Common Table Expressions (CTEs) in SQL Server kann der gefürchtete Fehler „Maximale Rekursionstiefe überschritten“ auftreten. Dies geschieht, wenn Ihre verschachtelten rekursiven Abfragen den vordefinierten Grenzwert der Datenbank überschreiten.
Die Lösung besteht in der Verwendung der Option maxrecursion
:
So ändern Sie Ihre Abfrage, um dieses Problem zu beheben:
<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>
Durch das Anhängen von OPTION (MAXRECURSION 0)
beseitigen Sie effektiv die Rekursionsbeschränkung, sodass die Abfrage unbegrenzt ausgeführt werden kann. Seien Sie jedoch vorsichtig, wenn Sie MAXRECURSION 0
verwenden. Stellen Sie sicher, dass Ihre CTE-Logik korrekt ist, um Endlosschleifen zu verhindern, die zu Leistungsproblemen oder Abstürzen führen könnten. Ziehen Sie alternative Ansätze in Betracht, wenn die Rekursionstiefe unerwartet groß ist. Die Verwendung von ISNULL
anstelle von CASE
vereinfacht den Code und verbessert die Lesbarkeit.
Das obige ist der detaillierte Inhalt vonWie kann der maximale Rekursionsfehler von SQL Server in rekursiven CTEs behoben werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!