化解32层递归限制

-- 2005化解32层递归限制,2000可用循环替代或用(游标while加break递归自己用一个变量传参)

if   object_id ( ' Tree ' , ' U ' is   not   null
    
drop   table   [ Tree ]
go
 
CREATE   TABLE   [ dbo ] . [ Tree ] (
    
[ ID ]   [ bigint ]   identity ,
    
[ Parent ]   as  (ID - 1 ),
    
[ Name ]   as  ( ' Name ' + rtrim (ID))

go
declare   @i   int
set   @i = 35
while   @i > 0
begin
    
insert   [ tree ]   default   values
    
set   @i = @i - 1
end
-- 生成格式:
/*
ID                   Parent               Name
-------------------- -------------------- ----------------------------
1                    0                    Name1
2                    1                    Name2
3                    2                    Name3
4                    3                    Name4
5                    4                    Name5
6                    5                    Name6
7                    6                    Name7
8                    7                    Name8
9                    8                    Name9
10                   9                    Name10
................................................

................................................
31                   30                   Name31
32                   31                   Name32
33                   32                   Name33
34                   33                   Name34
35                   34                   Name35

*/

go
if   object_id ( ' F_BOM ' , ' FN ' is   not   null
    
drop   function  F_BOM
go
create   function  F_BOM( @ID   int )
returns   nvarchar ( 1000 )
as
begin
    
declare   @s   nvarchar ( 1000 ), @Name   nvarchar ( 20 )
    lab:
    
set   @Name   = ( select  Name  from  Tree  where  ID = @ID )
    
select   @ID = Parent  from  Tree  where  ID = @ID
    
if   @Name   is   not   null
        
begin
            
set   @s = @Name + isnull ( ' - ' + @s , '' )
            
goto  lab
        
end
    
return   @s
end


go
if   object_id ( ' F_BOM2 ' , ' FN ' is   not   null
    
drop   function  F_BOM2
go
create   function  F_BOM2( @ID   int )
returns   nvarchar ( 1000 )
as
begin
    
declare   @s   nvarchar ( 1000 )
    
while   exists ( select   1   from  Tree  where  ID = @ID )
        
select   @s = Name + isnull ( ' - ' + @s , '' ), @ID = Parent  from  Tree  where  ID = @ID
    
return   @s
end
go

-- SQL2005:

if   object_id ( ' F_BOM3 ' , ' FN ' is   not   null
    
drop   function  F_BOM3
go
create   function  F_BOM3( @ID   int )
returns   nvarchar ( max )
as
begin
    
declare   @s   nvarchar ( max );
    
with  BOM(ID,Name,parent,lev)
    
as
    (
    
select  ID, cast (Name  as   nvarchar ( max )),parent, 0   from  tree  where  ID = @ID
    
union   all
    
select  
        a.ID,
cast (a.Name + ' - ' + b.Name  as   nvarchar ( max )),a.Parent,b.lev + 1
    
from  
        Tree a
    
join
        BOM b 
on  a.ID = b.Parent
    )    
    
select   @s = Name  from  BOM  where  lev = ( select   max (lev)  from  BOM)
    
option (maxrecursion  0 )                                         -- ---------設置遞歸次數0為無限制,默認為100層
     return   @s
end
go

select  dbo.F_BOM( 35 )
select  dbo.F_BOM2( 35 )
select  dbo.F_BOM3( 35 )
/*
Name1-Name2-Name3-Name4-Name5-Name6-Name7-Name8-Name9-Name10-
Name11-Name12-Name13-Name14-Name15-Name16-Name17-Name18-Name19-Name20-
Name21-Name22-Name23-Name24-Name25-Name26-Name27-Name28-Name29-Name30-
Name31-Name32-Name33-Name34-Name35
*/


 
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值