Check this solution:
;
with Q1 as
(
select year_start as y, year_end, period
from #TempParameters
union all
select y + 1, year_end, period
from Q1
where y + 1 <= year_end
),
Q2 as
(
select y, 1 as m1, case when period > 12 then 12 else period end m2, period
from Q1
union all
select y, m2 + 1, case when m2 + period > 12 then 12 else m2 + period end m2, period
from Q2
where m2 < 12
)
select m1 as month_start, m2 as month_end, y as [year]
from Q2
order by [year], month_start
option (maxrecursion 0)