ホームページ > データベース > mysql チュートリアル > SQL 再帰 CTE の「最大再帰 100 が使い果たされました」エラーを修正するにはどうすればよいですか?

SQL 再帰 CTE の「最大再帰 100 が使い果たされました」エラーを修正するにはどうすればよいですか?

Susan Sarandon
リリース: 2025-01-10 07:10:41
オリジナル
185 人が閲覧しました

How Can I Fix

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート