引用:   
  --测试数据   深度排序     
  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   a.*   
  FROM   @t   a,@t_Level   b   
  WHERE   a.ID=b.ID   
  ORDER   BY   b.Sort   
  /*--结果   
  ID       PID       Name                 
  ------   ---------   ----------     
  001     NULL   山东省   
  002     001       烟台市   
  004     002       招远市   
  003     001       青岛市   
  005     NULL   四会市   
  006     005       清远市   
  007     006       小分市   
  --*/--查询指定节点及其所有子节点的函数   
  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     招远市   
  --*/ --测试数据
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
/*--结果
|--山东省
  |--烟台市
    |--招远市
  |--青岛市
|--四会市
  |--清远市
    |--小分市
--*/
/*
标题:查询指定节点及其所有子节点的函数
作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开) 
时间:2008-05-12
地点:广东深圳
*/create table tb(id varchar(3) , pid varchar(3) , name varchar(10))
insert into tb values('001' , null  , '广东省')
insert into tb values('002' , '001' , '广州市')
insert into tb values('003' , '001' , '深圳市')
insert into tb values('004' , '002' , '天河区')
insert into tb values('005' , '003' , '罗湖区')
insert into tb values('006' , '003' , '福田区')
insert into tb values('007' , '003' , '宝安区')
insert into tb values('008' , '007' , '西乡镇')
insert into tb values('009' , '007' , '龙华镇')
insert into tb values('010' , '007' , '松岗镇')
go--查询指定节点及其所有子节点的函数
create function f_cid(@ID varchar(3)) returns @t_level table(id varchar(3) , level int)
as
begin
  declare @level int
  set @level = 1
  insert into @t_level select @id , @level
  while @@ROWCOUNT > 0
  begin
    set @level = @level + 1
    insert into @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--调用函数查询001(广东省)及其所有子节点
select a.* from tb a , f_cid('001') b where a.id = b.id order by a.id
/*
id   pid  name       
---- ---- ---------- 
001  NULL 广东省
002  001  广州市
003  001  深圳市
004  002  天河区
005  003  罗湖区
006  003  福田区
007  003  宝安区
008  007  西乡镇
009  007  龙华镇
010  007  松岗镇(所影响的行数为 10 行)
*/--调用函数查询002(广州市)及其所有子节点
select a.* from tb a , f_cid('002') b where a.id = b.id order by a.id
/*
id   pid  name       
---- ---- ---------- 
002  001  广州市
004  002  天河区(所影响的行数为 2 行)
*/--调用函数查询003(深圳市)及其所有子节点
select a.* from tb a , f_cid('003') b where a.id = b.id order by a.id
/*
id   pid  name       
---- ---- ---------- 
003  001  深圳市
005  003  罗湖区
006  003  福田区
007  003  宝安区
008  007  西乡镇
009  007  龙华镇
010  007  松岗镇(所影响的行数为 7 行)
*/drop table tb
drop function f_cid

解决方案 »

  1.   

    while 1=1 --> while @@ROWCOUNT>0
    while while @@ROWCOUNT>0
    begin
    select @parentID=iParentId from dbo.tb_sort
    where ID=@parentID
    if (@parentID=@secondID)
    print'不能把此节点的父节点及以上的节点作为子节点'if(@parentID=0)
    goto yxz
    end 
      

  2.   

    while while @@ROWCOUNT>0    :这个什么意思?
    if (@parentID=@secondID)
    print'不能把此节点的父节点及以上的节点作为子节点'
       这句的return不要的话怎么中断这个循环
      

  3.   

     @@ROWCOUNT>0 --返回以上插入的行计数
      

  4.   

    id   parentid    name   sort  
    1        0         a      1
    2        1         b      2
    3        1         c      3
    4        2         d      4
    5        2         e      5  给出2个节点   把2号节点放到1号下面
    比如2,4其他情况都可以,现在有个bug,就是2不能放4下面
    2是4的父节点   ,怎么排除把2放到4节点的这种情况
      

  5.   

    create proc proc_MoveTwoPointa 
    @firstID int, 
    @secondID int 
    as 
    declare @parentID int 
    select @parentID=iParentId 
    from dbo.tb_sort where id=@firstID while @@rowcount>0 --当没有影响的行是,就自动跳出循环了
    begin 
       select @parentID=iParentId from dbo.tb_sort 
       where ID=@parentID    if (@parentID=@secondID) 
             print'不能把此节点的父节点及以上的节点作为子节点' 
             break 
       if(@parentID=0) 
             update dbo.tb_sort 
             set dbo.tb_sort.iParentId=@firstID 
             where dbo.tb_sort.id=@secondIDend 
    end
      

  6.   

    还是有问题,bug  还是不能排除
      

  7.   

    print'不能把此节点的父节点及以上的节点作为子节点' 
    错误的情况下,这句话打不出来,不知是哪里错了