with cte
as
(select 1 number
union all
select number+1 from cte where number <1000)
select * from cte
显示错误:
声明终止。在语句完成之前,最大递归100已经用尽。
答案 0 :(得分:2)
错误告诉你问题所在,默认情况下,CTE的最大递归为100.这是故意的,因为它会阻止编码不良的CTE取出服务器并将其停止运行。
您可以使用OPTION MAXRECURSION
增加该值。因此,简单来说:
WITH CTE AS (
SELECT 1 AS I
UNION ALL
SELECT I + 1 AS I
FROM CTE
WHERE I + 1 <= 1000)
SELECT *
FROM CTE
OPTION (MAXRECURSION 1000);
CTE文档中涵盖了这一点:Using MAXRECURSION to cancel a statement