遞迴 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 已用盡。