Оптимальный способ вызова последовательности дат в хранимую процедуру

#sql #sql-server #tsql #stored-procedures #ssms

#sql #sql-сервер #tsql #хранимые процедуры #ssms

Вопрос:

У меня есть хранимая процедура

 EXEC demoProcedure @start='01-01-2019',@end = '02-01-2019'
  

Хранимая процедура принимает два параметра даты и выполняет поиск данных между ними. Мой вопрос в том, что я хотел бы, чтобы эта процедура проверялась несколько раз для множества диапазонов дат. Например, я хотел бы в основном вызвать:

 EXEC demoProcedure @start='01-01-2019',@end = '02-01-2019';
EXEC demoProcedure @start='02-01-2019',@end = '03-01-2019';
....
EXEC demoProcedure @start='12-01-2019',@end = '01-01-2020'
  

Или эффективный вызов этой хранимой процедуры один раз за каждый месяц. В прошлом я возился с созданием временной таблицы дат:

 ;WITH DateTable AS
(
SELECT row = 1, date = '2019-01-01'
UNION ALL

    SELECT row   1, DATEADD(YEAR, -1, date)
    FROM DateTable
    WHERE row   1 <= 7
)
SELECT *
FROM DateTable
  

Который эффективно возвращает первое января за последние 7 лет. Есть ли способ легко объединить эти два, чтобы вызвать хранимую процедуру один раз для каждого набора дат? Т.е. вызвать ее для start=row(1),end=row(2); start=row(2),end=row(3);…. до конца строки? Или есть более простой способ настроить все это. Спасибо!

Комментарии:

1. Почему бы вам не исправить процедуру для группировки результатов по месяцам? Тогда вам нужно вызвать ее только один раз, а не снова и снова.

2. Можете ли вы описать, почему вам нужно вызывать его отдельно для каждого месяца? Кроме того, возвращает ли SP набор данных, и нужно ли его использовать в какой-либо форме после вызова SP?

3. @remh . . . Действительно, если вы вызываете это в коде, то выполнение цикла while 12 раз кажется проще — и безопаснее — чем изменение базовой процедуры. Я подозреваю, что у вас есть какой-то другой мотив, например, возврат одного результирующего набора. Возможно, вы можете справиться с этим, вставив во временную таблицу.

4. Что сделало бы один способ «проще» другого?

5. Какова ваша конечная цель здесь? Скопировать данные в Excel или какое-либо другое программное обеспечение? Зачем вам нужно 12 отдельных наборов результатов вместо 1?