/*
表:MES_WuLiaoData
字段:wuliaoid,WuLiaoName,ShangCengWuLiao
要求传进一个wuliaoid可以找出以一个小树枝出来.
如:
wuliaoid,WuLiaoName,ShangCengWuLiao
1,a,0
2,b,1
3,c,2
4,d,3
5,e,2
当传进2去时要出
2,b,1
3,c,2
5,e,2
*/
--自己写了一个但是不好用,请高手指点
create function Tree_rs(@wuliaoid bigint)
returns @Tree_rs table(wuliaoid bigint,WuLiaoName varchar(100))
begin
declare @ShangCengWuLiao bigint, @WuLiaoName varchar(100)
DECLARE wuliao_tree CURSOR FOR
select wuliaoid,WuLiaoName,ShangCengWuLiao from MES_WuLiaoData where ShangCengWuLiao=@wuliaoid order by WuLiaoIDOPEN wuliao_tree
while @@FETCH_STATUS = 0
begin
FETCH NEXT FROM wuliao_tree into    
@wuliaoid,@WuLiaoName,@ShangCengWuLiao Insert @Tree_rs
values(@wuliaoid,@WuLiaoName)
        --此处不知道,写什么

end
CLOSE wuliao_treereturn
end

解决方案 »

  1.   

    --测试数据
    DECLARE @t TABLE(ID char(3),PID char(3),Name nvarchar(10))
    INSERT @t SELECT '001',NULL ,'山东省'
    UNION ALL SELECT '002','001','烟台市'
    UNION ALL SELECT '004','002','招远市'
    UNION ALL SELECT '003','001','青岛市'
    UNION ALL SELECT '005',NULL ,'四会市'
    UNION ALL SELECT '006','005','清远市'
    UNION ALL SELECT '007','006','小分市'--深度排序显示处理
    --生成每个节点的编码累计(相同当单编号法的编码)
    DECLARE @t_Level TABLE(ID char(3),Level int,Sort varchar(8000))
    DECLARE @Level int
    SET @Level=0
    INSERT @t_Level SELECT ID,@Level,ID
    FROM @t
    WHERE PID IS NULL
    WHILE @@ROWCOUNT>0
    BEGIN
    SET @Level=@Level+1
    INSERT @t_Level SELECT a.ID,@Level,b.Sort+a.ID
    FROM @t a,@t_Level b
    WHERE a.PID=b.ID
    AND b.Level=@Level-1
    END--显示结果
    SELECT SPACE(b.Level*2)+'|--'+a.Name
    FROM @t a,@t_Level b
    WHERE a.ID=b.ID
    ORDER BY b.Sort
    /*--结果
    |--山东省
      |--烟台市
        |--招远市
      |--青岛市
    |--四会市
      |--清远市
        |--小分市
    --*/
      

  2.   

    wuliaoid,WuLiaoName,ShangCengWuLiao
    1,a,0
    2,b,1
    3,c,2
    4,d,3
    5,e,2
    当传进2去时要出
    2,b,1
    3,c,2
    5,e,2select * from tb where wuliaoid=2 or shangcengwuliao=2
      

  3.   

    --测试数据
    CREATE TABLE tb(ID char(3),PID char(3),Name nvarchar(10))
    INSERT tb SELECT '001',NULL ,'山东省'
    UNION ALL SELECT '002','001','烟台市'
    UNION ALL SELECT '004','002','招远市'
    UNION ALL SELECT '003','001','青岛市'
    UNION ALL SELECT '005',NULL ,'四会市'
    UNION ALL SELECT '006','005','清远市'
    UNION ALL SELECT '007','006','小分市'
    GO--查询指定节点及其所有子节点的函数
    CREATE FUNCTION f_Cid(@ID char(3))
    RETURNS @t_Level TABLE(ID char(3),Level int)
    AS
    BEGIN
    DECLARE @Level int
    SET @Level=1
    INSERT @t_Level SELECT @ID,@Level
    WHILE @@ROWCOUNT>0
    BEGIN
    SET @Level=@Level+1
    INSERT @t_Level SELECT a.ID,@Level
    FROM tb a,@t_Level b
    WHERE a.PID=b.ID
    AND b.Level=@Level-1
    END
    RETURN
    END
    GO--调用函数查询002及其所有子节点
    SELECT a.*
    FROM tb a,f_Cid('002') b
    WHERE a.ID=b.ID
    /*--结果
    ID   PID  Name       
    ------ ------- ---------- 
    002  001  烟台市
    004  002  招远市
    --*/
      

  4.   

    select * from dbo.Tree_rs(2)这样调用函数不用改了,插入@Tree_rs就可以了
      

  5.   

    create table tb(wuliaoid int,WuLiaoName varchar(20),ShangCengWuLiao int)
    insert into tb select 1,'a',0
    insert into tb select 2,'b',1
    insert into tb select 3,'c',2
    insert into tb select 4,'d',3
    insert into tb select 5,'e',2CREATE FUNCTION f_Cid(@ID char(3))
    RETURNS @t_Level TABLE(ID char(3),Level int)
    AS
    BEGIN
        DECLARE @Level int
        SET @Level=1
        INSERT @t_Level SELECT @ID,@Level
        WHILE @@ROWCOUNT>0
        BEGIN
            SET @Level=@Level+1
            INSERT @t_Level SELECT a.wuliaoid,@Level
            FROM tb a,@t_Level b
            WHERE a.ShangCengWuLiao=b.ID
                AND b.Level=@Level-1
        END
        RETURN
    ENDselect a.* from tb a join dbo.f_Cid(2) b on a.wuliaoid=b.id
    where level=1 or level=2wuliaoid WuLiaoName ShangCengWuLiao
    2 b 1
    3 c 2
    5 e 2--取自己和一级子层
      

  6.   


    CREATE FUNCTION f_Cid(@ID int)
    RETURNS @t TABLE(wuliaoid int,wuliaoname int,ShangCengWuLiao int,Level int)
    AS
    BEGIN
        DECLARE @Level int
        SET @Level=1
        INSERT into @t SELECT *,@level from [MES_WuLiaoData] where wuliaoid=@id
        WHILE @@ROWCOUNT>0
        BEGIN
            SET @Level=@Level+1
            INSERT @t SELECT a.*,@Level FROM [MES_WuLiaoData] a,@t b
            WHERE a.ShangCengWuLiao=b.wuliaoid AND b.Level=@Level-1
        END
        RETURN
    END
    GOselect wuliaoid,wuliaoname,ShangCengWuLiao from dbo.f_cid(2)
      

  7.   


    --修改下
    create FUNCTION f_Cid(@ID int)
    RETURNS @t TABLE(wuliaoid int,wuliaoname varchar(20),ShangCengWuLiao int,Level int)
    AS
    BEGIN
        DECLARE @Level int
        SET @Level=1
        INSERT into @t SELECT *,@level from [MES_WuLiaoData] where wuliaoid=@id
        WHILE @@ROWCOUNT>0
        BEGIN
            SET @Level=@Level+1
            INSERT @t SELECT a.*,@Level FROM [MES_WuLiaoData] a,@t b
            WHERE a.ShangCengWuLiao=b.wuliaoid AND b.Level=@Level-1
        END
        RETURN
    END
    GOselect wuliaoid,wuliaoname,ShangCengWuLiao from dbo.f_cid(2)
    where level<=2
      

  8.   

    如果数据是这样的呢?
    1,a,0
    2,b,1
    3,c,2
    4,d,3
    5,e,2
    6,e1,5
    7,e2,6
    8,e3,7
    那么我加的后三行也可以出来不???