如果您看到以下存储过程,则该存储过程具有2019-01-01
,2019-12-31
作为输入。
我想做的是,我需要先通过2019-01-01
,2019-01-31
,然后通过2019-02-01
,2019-02-28
,直到12月。
任何人都可以帮助您如何动态地按月传递日期时间。
Exec storedprcedurename '2019-01-01','2019-12-31'
答案 0 :(得分:1)
您可以使用while循环和日期添加来执行它。另外,您可能需要设置一个最大日期,以便它不会陷入无限循环。
Declare @datemin date = '2019-01-01', @maxdate date = '2019-12-31'
While @datemin <= @maxdate
Begin
Declare @dateend date = dateadd(day, -1, dateadd(month,1,@datemin ))
Exec storedprcedurename @datemin , @dateend
set @datemin = dateadd(month, 1, @datemin)
end
答案 1 :(得分:0)
我可能会使用动态SQL来做到这一点。通常,我不建议在不使用@params参数到sp_executesql的情况下使用动态SQL,但是在这种情况下,您可以自己控制输入值。
因此,首先我们需要定义一个数据集,其中包含要用于传递给存储过程的日期。获得结果集中每个月的第一天就足够了-我们可以使用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;
您可以使用光标进行操作,并且代码可能更容易阅读。但是我长大了要避开光标...