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 に設定すると再帰制限が無効になり、エラーが効果的に防止されます。 ただし、注意をお勧めします: 階層データが不適切に構造化されているか循環参照が含まれている場合、無限再帰はパフォーマンスの問題やクラッシュを引き起こす可能性があります。 MAXRECURSION 0
を使用する前に、データと CTE ロジックを注意深く確認して、正しく終了していることを確認してください。 より堅牢な解決策には、MAXRECURSION
をより高い、ただし有限の値に設定するか、潜在的な無限ループがないかデータを分析することが含まれる場合があります。
以上がSQL 再帰 CTE の「最大再帰 100 が使い果たされました」エラーを修正するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。