递归超过最大100限制次数问题的解决

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限制次数问题。解决方法可以考虑修改递归语句,尽量避免递归深度过深,或者修改数据库系统的最大递归深度限制来解决。