Передать значения даты (динамически изменяемые) во входные параметры хранимой процедуры - PullRequest
0 голосов
/ 09 июня 2019

Если вы видите ниже хранимую процедуру, она имеет 2019-01-01, 2019-12-31 в качестве ввода.

То, что я хотел бы сделать, мне нужно передать 2019-01-01, 2019-01-31, а затем 2019-02-01, 2019-02-28 и то же самое до декабря.

Может ли кто-нибудь помочь, как динамически передавать дату время за месяцем.

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

Ответы [ 2 ]

1 голос
/ 09 июня 2019

Вы можете использовать цикл 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
0 голосов
/ 09 июня 2019

Я бы, наверное, сделал это с динамическим 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;

Вы можете сделать это с помощью курсора, и код, вероятно, будет немного проще для чтения.Но я воспитан, чтобы уклоняться от курсоров ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...