используя цикл в хранимой процедуре - PullRequest
4 голосов
/ 07 февраля 2012

Я пытаюсь написать процедуру, которая вставляет строки во временную таблицу. Основой таблицы является таблица страховых полисов, в которой указана сумма премии, заработанной за период действия полисов. исходные данные состоят из дат trans_date (дата продажи) и дат policy_start и policy_end. То есть, если полис рассчитан на 12 месяцев, мы даем каждый месяц 1/12 собранной премии.

так что-то вроде

while trans_month < policy_end month

insert to tblUEPtmp
select dateadd(mm, 1, trans_date), earned_premium from tblpolicys

set trans_date = dateadd(mm, 1, trans_date)

(я знаю, что это код мусора, но на данный момент я совершенно сбит с толку)

Моя проблема заключается в том, что мне нужно создать дополнительные 11 строк данных и изменить дату транзакции, добавляя каждый месяц 1 месяц до измененной даты транзакции = policy_end date.

Я исследовал использование CTE, но пока петли в CTE невозможны ..

это что-то, что может сделать функция таблицы с несколькими состояниями?

Большое спасибо.

Ответы [ 2 ]

3 голосов
/ 07 февраля 2012

Вы можете сделать это с помощью CTE, например, этот небольшой фрагмент покажет, как выполнить рекурсию с использованием дат:

declare @start DATETIME = '2012-02-01'
declare @end DATETIME = '2013-02-01'
;with cte (date)
AS
(
    SELECT @start
    UNION ALL
    SELECT DATEADD(mm,1,cte.date)
    FROM cte WHERE DATEADD(mm,1,cte.date)<@end
)
select * from cte

, которая сгенерирует список дат между @start & @endс пропусками по месяцам.

Вы можете

  1. Использовать свои реальные таблицы вместо фиктивных дат
  2. Выполните insert into...select ... from cte, чтобы вставить необходимые данные

Если вы можете предоставить более подробную информацию о вашей схеме таблицы, я, вероятно, могу помочь с более конкретным примером.

1 голос
/ 07 февраля 2012

Как то так?

set @trans_date = ...
while @trans_date < @policy_end
begin
    insert to tblUEPtmp 
      select trans_date, earned_premium
      from tblpolicys
      where {whatever}
    set @trans_date = dateadd(mm, 1, @trans_date)
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...