Это довольно просто, используя таблицу подсчета. Я держу один как взгляд на мою систему. Это генерирует 10 000 неприятных постов. Вы можете прочитать больше о таблицах учета от Джеффа Модена здесь .
create View [dbo].[cteTally] as
WITH
E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
cteTally(N) AS
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
)
select N from cteTally
GO
Теперь мы можем использовать эту таблицу для генерации необходимых вам данных. Нам просто нужно использовать немного математики дат, чтобы выделить нужные месяцы.
select dateadd(month, t.N - 1, dateadd(month, datediff(month, 0, getdate()) + 1, 0))
from cteTally t
where t.N <= datediff(month
, dateadd(month, datediff(month, 0, getdate()) + 1, 0) --beginning of next month
, dateadd(year, datediff(year, 0, getdate()) + 1, 0) --beginning of next year
) + 48 --add 48 because the next four years of months are static