2012-04-02 4 views
3

私は私がループを使用せずにそれを実装することができますどのように、複数の部分に金額を分割し、割賦と呼ばれるテーブルに挿入する必要がありますか?分割した金額をループを使用せずにテーブルに挿入する方法は?

declare @installment as table (installment_index int identity(1,1), 
         amount money, 
         due_date datetime) 

declare @total_amount money 
declare @number_of_installment int 
declare @amount money 
declare @i int 
declare @date datetime 

set @date = getdate() 
set @number_of_installment = 20 
set @total_amount = 5001.00 
set @amount = @total_amount/@number_of_installment 
set @i= 1 

while @i <= @number_of_installment 
begin 
    insert into @installment 
    (amount,due_date) values (@amount, dateadd(month,@i,@date)) 
    set @i = @i + 1 
end 

+1

あなたは、whileループを避けるためにしようとしている理由として、より多くの洞察を提供することができますか? – jn29098

+0

私はちょうど、パフォーマンスが向上するいくつかの解決策があるかもしれないことを知りたがっています。 – skywills

答えて

5

ループしながら、これは交換するでしょう: 挿入を@number_of_installmentする1から数字の

;with numbers as (
    select 1 number 
    union all 
    select number + 1 
    from numbers 
    where number < @number_of_installment 
) 
insert into @installment (amount,due_date) 
select @amount, dateadd(month,number,@date) 
from numbers 
option (maxrecursion 0) 

CTE番号を返すテーブルが@installmentする@number_of_installmentレコードを挿入するには、このテーブルを使用しています。

EDIT:

私はそれを言及する必要があり、this articleによると、何も同様の目的のために数値/日付の補助テーブルに勝るものはありません。

関連する問題