递归用函数、存储过程实现的效果

--測試

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

 

 

原文地址:https://www.cnblogs.com/Roy_88/p/5463118.html