【发布时间】:2016-09-06 22:42:48
【问题描述】:
以下递归查询应选择当天之后的四个星期五:
DECLARE @friday date
DECLARE @today date
Set @friday = '2016-09-02'
Set @today = convert (date, getdate())
While (datediff(dd, @Friday, @today) % 7) != 0
BEGIN
Set @today = DATEADD (dd, 1, @today)
END;
With FourFridays (Friday) as (
Select @today
union all
select DATEADD(DD, 7, Friday)
FROM FourFridays
)
Select * from FourFridays
OPTION(MAXRECURSION 3)
我得到的结果看起来不错,但在 SQL Server Management Studio 中出现“在语句完成之前已用尽最大递归 3”错误。有任何想法吗?
【问题讨论】:
-
MAXRECURSION 本身并不会在某个点生成递归 CTE,它只是告诉 SQL 如果您进行的递归深度超过三个,则会产生错误。要在三个递归处停止而没有错误,您需要有某种 WHERE 语句以及所需的任何逻辑。顺便说一句,您可以简单地使用
SELECT DATEADD(DD, N*7, @today) Friday FROM (VALUES (0),(1),(2),(3)) T(N),而不是使用递归 CTE -
我很欣赏 MAXRECURSION 的解释。我认为它在指定的递归次数后切断了查询。下面 Manuela 的示例包含了您建议的 WHERE 语句。我也喜欢你的替代解决方案。谢谢!
标签: sql sql-server recursion