在遞歸 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
可以簡化程式碼並提高可讀性。
以上是如何解決SQL Server遞迴CTE中的最大遞迴錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!