一个现成的例子:
---------------------------------------------------------------------------------------------------------------------------
--生成测试数据
create table BOM(ID INT,PID INT,MSG VARCHAR(1000))
insert into BOM select 1,0,NULL
insert into BOM select 2,1,NULL
insert into BOM select 3,1,NULL
insert into BOM select 4,2,NULL
insert into BOM select 5,3,NULL
insert into BOM select 6,5,NULL
insert into BOM select 7,6,NULL
go--创建用户定义函数
create function f_getChild(@ID VARCHAR(10))
returns @t table(ID VARCHAR(10),PID VARCHAR(10),Level INT)
as
begin
    declare @i int,@ret varchar(8000)
    set @i = 1
    insert into @t select ID,PID,@i from BOM where ID = @ID
    
    while @@rowcount<>0
    begin
        set @i = @i + 1
        
        insert into @t 
        select 
            a.ID,a.PID,@i 
        from 
            BOM a,@t b 
        where 
            a.PID=b.ID and b.Level = @i-1
    end
    return
end
go--执行查询
select ID from dbo.f_getChild(3)
go--输出结果
/*
ID
----
3
5
6
7
*/--删除测试数据
drop function f_getChild
drop table BOM

解决方案 »

  1.   

    create table BOM(序号 int,标题 varchar(10),父序号 int)
    insert into BOM select 1,'a',1
    insert into BOM select 2,'b',1
    insert into BOM select 3,'c',1
    insert into BOM select 4,'d',2
    insert into BOM select 5,'e',3
    insert into BOM select 6,'f',4
    gocreate function f_getTree(@ID int)
    returns @t table(序号 int,标题 varchar(10),父序号 int)
    begin
        insert into @t select * from BOM where 序号=@ID
        while @@rowcount<>0
        begin
            insert into @t 
            select a.* 
            from BOM a,@t b 
            where 
                a.父序号=b.序号 
                and
                not exists(select 1 from @t where 序号=a.序号)
        end
        return
    end
    goselect * from dbo.f_getTree(2)
    /*序号          标题         父序号         
    ----------- ---------- ----------- 
    2           b          1
    4           d          2
    6           f          4
    */drop function f_getTree
    drop table BOM