将日期值(动态更改)传递到存储过程的输入参数

时间:2019-06-09 19:34:19

标签: sql sql-server

如果您看到以下存储过程,则该存储过程具有2019-01-012019-12-31作为输入。

我想做的是,我需要先通过2019-01-012019-01-31,然后通过2019-02-012019-02-28,直到12月。

任何人都可以帮助您如何动态地按月传递日期时间。

Exec storedprcedurename '2019-01-01','2019-12-31'

2 个答案:

答案 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;

您可以使用光标进行操作,并且代码可能更容易阅读。但是我长大了要避开光标...