Я бы, наверное, сделал это с динамическим SQL.Обычно я бы не рекомендовал динамический SQL без использования параметра @params для sp_executesql, но в этом случае вы сами контролируете входные значения.
Поэтому сначала нам нужно определить набор данных с датами дляиспользуйте для перехода к хранимой процедуре.Достаточно получить первый день каждого месяца в наборе результатов - мы можем использовать функцию EOMONTH, чтобы получить последний день каждого месяца.
Я делаю это, используя CTE ниже.
--Define startdate
DECLARE @startdate date='2019-01-01';
--Number of months
DECLARE @numMonths int=12;
--variable to store some dynamic SQL in
DECLARE @dynSQL nvarchar(max)=N'';
--CTE to get the dates
WITH tens AS(
SELECT n FROM(VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1))t(n)
), thousands AS(
SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL))-1 as n
FROM tens t0
CROSS JOIN tens t1
CROSS JOIN tens t2
CROSS JOIN tens t3
), dates AS(
SELECT TOP(@numMonths) DATEADD(month,n,@startDate) as startDate
FROM thousands
ORDER BY n
)
--And now we construct the dynamic SQL statement to call the proc based on the CTE dates
SELECT
@dynSQL = @dynSQL +
N'exec storedprocedurename ''' +
cast(startDate as nvarchar(50)) +
N''',''' +
cast(EOMONTH(startDate) as nvarchar(50)) +
N''';
'
FROM dates ORDER BY startDate;
--Make sure the dynamic SQL string looks correct Before executing
PRINT @dynSQL;
--When you are sure you got it right, comment the PRINT statement and uncomment below
--exec sp_executesql @dynSQL;
Вы можете сделать это с помощью курсора, и код, вероятно, будет немного проще для чтения.Но я воспитан, чтобы уклоняться от курсоров ...