【问题标题】:TRANSACT SQL: "max recursion exhausted" error but good results for recursive queryTRANSACT SQL:“最大递归耗尽”错误,但递归查询的结果很好
【发布时间】: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


【解决方案1】:

在没有最大递归错误的情况下预览递归将导致的位置:

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, Recursion) as (
 Select @today, 1
 union all
 select DATEADD(DD, 7, Friday), Recursion + 1
 FROM FourFridays
 where  Recursion < 10
 )

 Select * from FourFridays 
 --OPTION(MAXRECURSION 3)

【讨论】:

  • 我很高兴。当它有效时,请将答案标记为正确
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-10
  • 2021-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
相关资源
最近更新 更多