declare @stDate datetime = '20111231' --40908
declare @enDate datetime = '20130102' --41276
select datepart(year,@StDate) as Y,datepart(month,@StDate) as M
;with ste (Y,M,D)
as(
select datepart(year,@StDate) as Y,datepart(month,@StDate) as M, @stDate as D
union all
select datepart(year,dateadd(month,1,ste.D)) as Y,datepart(month,dateadd(month,1,ste.D)) as M, dateadd(month,1,ste.D)
from ste
where ste.D <= @enDate
)
select Y, M from ste