递归 CTE
这个例子说明了从今年到 2011 年(2012 年 - 1 年)每年如何获得。
WITH yearsAgo
(
myYear
)
AS
(
-- Base Case: This is where the recursion starts
SELECT DATEPART(year, GETDATE()) AS myYear
UNION ALL -- This MUST be UNION ALL (cannot be UNION)
-- Recursive Section: This is what we're doing with the recursive call
SELECT yearsAgo.myYear - 1
FROM yearsAgo
WHERE yearsAgo.myYear >= 2012
)
SELECT myYear FROM yearsAgo; -- A single SELECT, INSERT, UPDATE, or DELETE
myYear |
---|
2016 |
2015 年 |
2014 |
2013 |
2012 |
2011 |
你可以使用 MAXRECURSION 作为查询选项来控制递归(在代码中认为堆栈溢出),这将限制递归调用的数量。
WITH yearsAgo
(
myYear
)
AS
(
-- Base Case
SELECT DATEPART(year , GETDATE()) AS myYear
UNION ALL
-- Recursive Section
SELECT yearsAgo.myYear - 1
FROM yearsAgo
WHERE yearsAgo.myYear >= 2002
)
SELECT * FROM yearsAgo
OPTION (MAXRECURSION 10);
Msg 530,Level 16,State 1,Line 2 声明终止。在语句完成之前,最大递归 10 已用尽。