再帰出来る回数の上限について

再帰クエリで UPDATE してみる - お だ のスペースSQL SERVER の再帰クエリについて記述しましたが、大事な事を忘れていました。
無限ループ等になった際に困るので再帰出来る回数の上限が決まっています。

共通テーブル式を使用する再帰クエリ より引用

メモ : 
不適切に作成された再帰 CTE は無限ループの原因となる可能性があります。たとえば、再帰メンバー クエリ定義によって親列と子列に同じ値が返される場合、無限ループが作成されます。再帰クエリの結果をテストする際には、INSERT、UPDATE、DELETE、または SELECT のいずれかのステートメントの OPTION 句で MAXRECURSION ヒントおよび 0 から 32,767 までの値を使用して、特定のステートメントで使用できる再帰レベルの数を制限できます。詳細については、「クエリ ヒント (Transact-SQL)」および「WITH common_table_expression (Transact-SQL)」を参照してください 

テーブルヒントで、MAXRECURSION を指定すると、再帰の回数を変更出来るようです。

クエリ ヒント (Transact-SQL) より引用

MAXRECURSION number
このクエリで許可される最大再帰数を指定します。number は、0 〜 32,767 の負以外の整数です。0 を指定した場合、制限は適用されません。このオプションが指定されない場合、サーバーの既定の上限値である 100 が使用されます。

クエリの実行中に MAXRECURSION の指定した上限値または既定上限値に達した場合、クエリは終了し、エラーが返されます。

このエラーのため、ステートメントのすべての効果がロールバックされます。ステートメントが SELECT ステートメントであった場合、結果の一部が返されるか、結果がまったく返されないかのいずれかになります。結果の一部が返された場合でも、指定した最大再帰レベルを超える再帰レベルのすべての行は含まれていない可能性があります。

詳細については、「WITH common_table_expression (Transact-SQL)」を参照してください。

MAXRECURSION では、0 から 32767 迄指定可能で、0 を指定すると上限が無くなるようです。また、指定しない場合の既定値は 100 となっています。
実際に 0 を指定した際に制限が無くなるか試してみました。

WITH [CTE] ([level]) AS (
  SELECT 
    1 as [level]
  UNION ALL 
  SELECT 
    [CTE].[level] + 1 
  FROM 
    [CTE] 
) 

SELECT [level] FROM [CTE] OPTION (MAXRECURSION 0)

これを SSMS から実行すると、32767 以上の値を取得していました。※80万位で強制終了した。
ってことで、再帰クエリを使用する場合は 上限値に気を付けてください。