1. 程式人生 > >遞迴用函式、儲存過程實現的效果

遞迴用函式、儲存過程實現的效果

--測試

create table ta ( 專案 varchar ( 20), 上級專案 varchar ( 20), num int )

insert ta

select 'A' , '' , 100 union all

select 'B' , 'A' , 200 union all

select 'C' , 'B' , 300 union all

select 'D' , 'B' , 400 union all

select 'E' , 'C' , 500 union all

select 'F' , 'D' , 600 union all

select 'H' , 'E' , 700 union all

select 'G' , 'F' , 800

-- 如果要顯示上級的專案 :

create function roy_f( @ 專案 varchar ( 20))

returns varchar ( 100)

as

begin

declare @ 上級專案 varchar ( 20)

select @ 上級專案 = 上級專案 from ta where 專案 = @ 專案

return case when @ 上級專案 is null then null

else isnull ( dbo. roy_f( @ 上級專案 )+ '-' , '' )+ @ 專案 end

end

-- 如果顯示各級專案的彙總金額 :

create function roy_f2( @ 專案 varchar ( 20))

returns int

as

begin

declare @tb table ( 專案 varchar ( 20), 上級專案 varchar ( 20), num int , lev int )

declare @i int , @sum int

set @i= 0

insert @tb select *, @i from ta where 專案 = @ 專案

while @@rowcount > 0

begin

set @i= @i+ 1

insert @tb

select a.*, @i

from ta a, @tb b

where b. 專案 = a. 上級專案 and b. lev= @i- 1

end

select @sum= sum ( num) from @tb

return @sum

end

-- 測試 :

select 專案 , 金額 = dbo. roy_f2( 專案 ), 關係 = dbo. roy_f( 專案 ) from ta

/*

專案 金額 關係

-------------------- ----------- ---------------

A 3600 A

B 3500 A-B

C 1500 A-B-C

D 1800 A-B-D

E 1200 A-B-C-E

F 1400 A-B-D-F

H 700 A-B-C-E-H

G 800 A-B-D-F-G

(所影響的行數為 8 行)

*/

-- 用儲存過程統計 :

create proc roy_p @ 專案 varchar ( 20)

as

begin

declare @i int

set @i= 0

select *, 級數 = @i into #

from ta where 專案 = @ 專案

while @@rowcount > 0

begin

set @i= @i+ 1

insert #

select ta.*, 級數 = @i

from ta, # b

where ta. 上級專案 = b. 專案

and b. 級數 = @i- 1

end

select [sum]= sum ( num) from #

end

-- 測試 :

exec roy_p 'A'

/*

sum

-----------

3600

(所影響的行數為 1 行)

*/

-- 刪除測試 :

drop function roy_f, roy_f2

drop proc roy_p

drop table ta