SQL With(再帰CTEクエリ)

900 ワード

再帰CTEの組み合わせが正しくない場合、無限ループを引き起こす可能性があります.たとえば、再帰メンバー・クエリー定義が親カラムと子カラムに同じ値を返す場合、無限ループが発生します.MAXRECURSIONプロンプトおよびINSERT、UPDATE、DELETE、またはSELECT文のOPTION句のうちの1つの0から32767までの値を使用して、特定の文で許容される再帰級数を制限し、無限ループが発生しないようにすることができます.これにより,ループを生成するコード問題を解決する前に文の実行を制御することができる.サーバ範囲のデフォルト値は100です.0を指定した場合、制限はありません.文ごとに1つのMAXRECURSION値しか指定できません.詳細については、クエリー・プロンプト(Transact-SQL)を参照してください.
 
例:
 
USE AdventureWorks;
GO
--Creates an infinite loop
WITH cte (EmployeeID, ManagerID, Title) as
(
    SELECT EmployeeID, ManagerID, Title
    FROM HumanResources.Employee
    WHERE ManagerID IS NOT NULL
  UNION ALL
    SELECT cte.EmployeeID, cte.ManagerID, cte.Title
    FROM cte 
    JOIN  HumanResources.Employee AS e 
        ON cte.ManagerID = e.EmployeeID
)
--Uses MAXRECURSION to limit the recursive levels to 2
SELECT EmployeeID, ManagerID, Title
FROM cte
OPTION (MAXRECURSION 2);
GO