解决方案 »

  1.   

    参考
    --查所有子结点,带路径与排序
    if object_id('f_getC') is not null drop function f_getC
    go
    create function f_getC(@id int)  
    returns @re table(id int,level int,sort varchar(100),path varchar(500))  
    as  
    begin
        declare @l int  
        set @l=0  
        insert @re 
     select [modeid],@l,right('00000'+ltrim(modeid),5),modename 
     from tb where parentid=@id
        while @@rowcount>0
        begin  
            set @l=@l+1
            insert @re 
      select a.modeid,@l,b.sort+right('00000'+ltrim(a.modeid),5), 
          b.path+' - '+a.modename
      from tb as a,@re as b  
      where b.id=a.parentid and b.level=@l-1
        end
        update @re set level = level 
        return  
    end  
    go select a.modeid,a.parentid,REPLICATE('  ',b.level) +'┝'+a.modename,b.level,b.sort ,b.path from tb  a,f_getC(0) b  
    where a.modeid=b.id  
    order by sort/*
    modeid      parentid                         level                            
    ----------- ----------- -------------------- ----------- -------------------- ----------------------------------------
    100         0           ┝商品管理                0           00100                商品管理
    107         100           ┝商品管理              1           0010000107           商品管理 - 商品管理
    110         107             ┝商品信息管理          2           001000010700110      商品管理 - 商品管理 - 商品信息管理
    111         107             ┝商品分类管理          2           001000010700111      商品管理 - 商品管理 - 商品分类管理
    112         107             ┝回收站管理           2           001000010700112      商品管理 - 商品管理 - 回收站管理
    108         100           ┝明细管理              1           0010000108           商品管理 - 明细管理
    114         108             ┝团购管理            2           001000010800114      商品管理 - 明细管理 - 团购管理
    115         108             ┝拍卖管理            2           001000010800115      商品管理 - 明细管理 - 拍卖管理
    116         108             ┝优惠管理            2           001000010800116      商品管理 - 明细管理 - 优惠管理
    109         100           ┝物流管理              1           0010000109           商品管理 - 物流管理
    101         0           ┝定单管理                0           00101                定单管理
    102         0           ┝用户管理                0           00102                用户管理
    117         102           ┝会员管理              1           0010200117           用户管理 - 会员管理
    118         102           ┝会员卡管理             1           0010200118           用户管理 - 会员卡管理
    119         102           ┝资金管理              1           0010200119           用户管理 - 资金管理
    120         102           ┝管理员管理             1           0010200120           用户管理 - 管理员管理
    121         120             ┝添加管理员           2           001020012000121      用户管理 - 管理员管理 - 添加管理员
    122         120             ┝修改管理员           2           001020012000122      用户管理 - 管理员管理 - 修改管理员
    104         0           ┝学院广告                0           00104                学院广告
    105         0           ┝系统设置                0           00105                系统设置
    106         0           ┝附件管理                0           00106                附件管理(21 行受影响)
      

  2.   

    要是oracle就简单了,connect by start with构建树形,sys_connect_by_path获取路径
      

  3.   

    可以考虑用CTE做出一个带id和path的结果集, 然后再更新回去。
      

  4.   

    那我把这个表导入到oracle中,更新完以后我再导回SQLSERVER中可以吗?按你这个方法如何写呢?
      

  5.   

    那我把这个表导入到oracle中,更新完以后我再导回SQLSERVER中可以吗?按你这个方法如何写呢?
    导入oracle,用下面语句查询,然后将查询结果导回sqlsever即可
    SELECT  T.*,sys_connect_by_path(ID,'/')
    FROM T
    CONNECT BY PRIOR ID=PID
    START WITH PID=0