2012-02-07 101 views
4

我正在尝试编写一个将行插入临时表的过程。该表格的基础是保险单表,其中列出了保单生命期间赚取的保费金额。原始数据由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研究,但while循环,也没有更多钞票的CTE内..

这事多语句表函数可以做什么?

非常感谢。

+0

我们可以解释一下你在做什么。谢谢 – joshua 2012-02-07 11:07:07

+0

试图插入创建的行,按比例划分原始保费到policy_start和policy_end之间的月数,以便我可以总结出多少保费已经在任何一个月。 – 2012-02-07 11:15:18

回答

3

您可以杰福做到这一点的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插入你需要的数据

如果您可以提供有关表模式更详细,我可以帮助一个更具体的例子。

+0

如果我一次只通过一行,这只会起作用吗?怎么样传递一个查询? – 2012-02-07 13:29:30

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