SQL用递归函数构造树

--===================================================

--创建一个递归调用函数

--===================================================

IF OBJECT_ID (N'digui') IS NOT NULL

   DROP FUNCTION digui

GO

 

create   function   digui(@bmdm numeric(4,0))--参数部门代码

  

returns   @bmTable   table    

(

    i_bmdm numeric(4,0),--部门代码

    v_bmmc varchar(100),--部门名称

    v_bmjc varchar(100),--部门简称

    i_jb   numeric(4,0),--级别

    i_sjdm numeric(4,0) --上级部门代码

)

as    

 

begin

 

    --先把部门代码等于@bmdm的记录插入到返回表中

    insert   @bmTable(i_bmdm,v_bmmc,v_bmjc,i_jb,i_sjdm)  

    select   i_bmdm,v_bmmc,v_bmjc,i_jb,i_sjdm from PT_D_BM

    where i_bmdm = @bmdm

     

    --如果存在子部门的话

    if exists(select 1 from PT_D_BM where i_sjdm=@bmdm)  

    begin 

       declare @i_bmdm numeric(4,0)

       declare @v_bmmc varchar(100)

       declare @v_bmjc varchar(100)

       declare @i_jb   numeric(4,0)

       declare @i_sjdm numeric(4,0)

     

       --声明一个游标,根据@bmdm选择其下级的部门

       declare cursor_bmTable cursor for  

       select i_bmdm,v_bmmc,v_bmjc,i_jb,i_sjdm from PT_D_BM

       where  i_sjdm=@bmdm order by i_xh for read only

       

       open   cursor_bmTable  

       fetch cursor_bmTable into @i_bmdm,@v_bmmc,@v_bmjc,@i_jb,@i_sjdm  

       

       --当执行成功时

       while @@fetch_Status=0  

           begin

              insert @bmTable select * from dbo.digui(@i_bmdm) --递归调用

              fetch cursor_bmTable into @i_bmdm,@v_bmmc,@v_bmjc,@i_jb,@i_sjdm

           end

       close     cursor_bmTable   --关闭游标

       deallocate cursor_bmTable   --释放游标

    end  

    return  

end

 

/*创建表[PT_D_BM]

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

SET ANSI_PADDING ON

GO

CREATE TABLE [dbo].[PT_D_BM](

    [I_BMDM] [numeric](4, 0) NOT NULL,--部门代码(有用)

    [V_BMMC] [varchar](100)         NULL,--部门名称(有用)

    [V_BMJC] [varchar](100)         NULL,--部门简称

    [V_BMJX] [varchar](100)         NULL,--部门简写

    [I_XH] [numeric](4, 0)          NULL,--序号(有用)

    [I_SJDM] [numeric](4, 0)    NULL,--上级部门代码(有用)

    [I_JB] [numeric](4, 0)          NULL,--级别(有用)

    [C_SFYX] [char](1)              NULL,--是否有效

    [C_BS] [char](1)            NULL,--公司标识

    [I_GSXZ] [numeric](4, 0)    NULL,--公司性质

    [I_GLID] [numeric](4, 0)    NULL,--管理ID

    [V_FACTORY_CODE] [varchar](4)   NULL,--工厂代码

    [V_SYS_CODE] [varchar](40)      NULL --系统代码

) ON [PRIMARY]

 

GO

SET ANSI_PADDING OFF

*/

/*这样调用函数*/

select * from dbo.digui(151)

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值