您的位置:首页 > 其它

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

2006-12-24 18:21 459 查看
--測試





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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: