ホームページ >データベース >mysql チュートリアル >再帰的 CTE における SQL Server の最大再帰エラーを解決するにはどうすればよいですか?

再帰的 CTE における SQL Server の最大再帰エラーを解決するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-10 06:02:40165ブラウズ

How to Solve SQL Server's Max Recursion Error in Recursive CTEs?

再帰的 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。