ホームページ >データベース >mysql チュートリアル >再帰的 CTE における SQL Server の最大再帰エラーを解決するにはどうすればよいですか?
再帰的 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
を使用すると、コードが簡素化され、読みやすくなります。
以上が再帰的 CTE における SQL Server の最大再帰エラーを解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。