drop table #data
create table #data (name varchar(50),begindate date,enddate date)
insert into #data values('甲一','2021-01-02','2021-03-31')
insert into #data values('甲二','2020-12-05','2021-02-28')
select * from #data
with cte as(
select dateadd(dd,-datepart(dd,dateadd(mm,1,begindate)),dateadd(mm,1,begindate)) as startmonth,name,begindate,enddate
from #data
union all
select
--dateadd(mm,1,A.startmonth) as 加一月 --用加一月去比对则正常
dateadd(dd,-datepart(dd,dateadd(mm,1,a.startmonth)),dateadd(mm,1,a.startmonth)) as startmonth
--用加一月并算月末最后以自然日比对,则递归次数超限
,a.name,A.begindate,A.enddate from cte A
join #data B on A.name=B.name and A.begindate=B.begindate and a.enddate=b.enddate
where --dateadd(mm,1,A.startmonth)<=B.enddate --用加一月去比对,则正常
dateadd(dd,datepart(dd,dateadd(mm,1,a.startmonth)),dateadd(mm,1,a.startmonth))<=B.enddate
)--用加一月并算月末最后以自然日比对,则递归次数超限
select * from cte order by name,startmonth
递归中,停止的依据是,生成的startmonth达到了enddate的月份(忽略自然日)
为什么只是用月末比对,就超限制了?
递归超过最大100限制次数问题通常是由于递归语句导致的,递归语句的递归深度大于数据库系统配置的最大递归深度限制(默认为100)而引起的。对于问题中给出的递归语句,使用月末比对产生的递归深度可能会比使用加一月比对更深,因此可能会导致递归超过最大100限制次数问题。解决方法可以考虑修改递归语句,尽量避免递归深度过深,或者修改数据库系统的最大递归深度限制来解决。