SQL Server CTE递归查询

时间:2021-03-18 13:50:33

标签: sql sql-server common-table-expression recursive-query

谁能向我解释以下查询是如何工作的?

with my_query (my_date) as (select convert(date, '03-10-2021', 105)
                            union all
                            select dateadd(day, 1, my_date)
                            from my_query
                            where my_date <= convert(date, '03-10-2021', 105))

select *
from my_query;

我的想法是这个查询会进入无限循环,因为每次执行查询的递归部分时它仍然会在数据中找到行,但实际上查询终止并返回结果广告这很奇怪。

感谢对我的问题的任何解释。

谢谢

1 个答案:

答案 0 :(得分:0)

您的查询总是返回两行:

首先选择:

 select  convert(date, '03-10-2021', 105)

返回:'03-10-2021'

您正在检查的递归部分 my_date 现在是“03-10-2021”等于或大于“03-10-2021”,这是真的,它返回 dateadd(day, 1, my_date)

2021-10-04

所以下一级递归,现在 my_day = '2021-10-04' 和条件检查是否 '2021-10-04' <= convert(date, '03-10-2021', 105) 这是假的,所以递归停止