在存储过程中使用循环

时间:2012-02-07 11:04:56

标签: sql sql-server sql-server-2005 tsql

我正在尝试编写一个将行插入临时表的过程。该表的基础是一份保险单表,列出了在政策生命周期内获得的保费金额。原始数据包含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)

(我知道这是rubbush代码,但我现在完全感到困惑)

我的问题是我需要创建额外的11行数据并修改交易日期,每次增加1个月,直到修改后的交易日期= policy_end日期。

我已经研究过使用CTE,但是虽然循环在CTE中是不可能的。

这是多语句表功能可以做的事吗?

非常感谢。

2 个答案:

答案 0 :(得分:3)

您可以使用CTE进行defo,例如,这个小片段将演示如何使用日期进行递归:

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&amp;之间的日期列表。 @end月份差距。

你可以

  1. 使用真实的桌子代替虚拟日期
  2. 执行insert into...select ... from cte以插入所需数据
  3. 如果您可以提供有关表模式的更多详细信息,我可以帮助您提供更具体的示例。

答案 1 :(得分:1)

这样的东西?

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