排查 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會停用遞歸限制,有效防止錯誤。 但是,建議小心:如果分層資料結構不正確或包含循環引用,無限遞歸可能會導致效能問題或崩潰。仔細檢查您的資料和 CTE 邏輯,確保其在使用 MAXRECURSION 0
之前正確終止。 更穩健的解決方案可能涉及將 MAXRECURSION
設定為更高但有限的值,或分析資料以發現潛在的無限循環。
以上是如何修復 SQL 遞歸 CTE 中的「最大遞歸 100 已耗盡」錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!