首先,你的id字段及parentid字段有没有建立索引,没有建立索引的话当然很慢.其次,如果是对全部的数据进行处理,最好改用全局处理的得到编码累计的函数.你可以贴出你的表结构,我明天给你处理一下

解决方案 »

  1.   

    我在这个表所有任务中看了索引,PartsID   是 聚集
    不知这样是不是索引列??
    CREATE TABLE [dbo].[BCParts] (
    [PartsID] [nvarchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,--这是产品的主编号,也是主键!
    [BCname] [nvarchar] (30) COLLATE Chinese_PRC_CI_AS NULL ,--这是品名
    [Specification] [nvarchar] (30) COLLATE Chinese_PRC_CI_AS NULL ,--这是型号
    [PPartsID] [nvarchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,--这是父项
            
    ) ON [PRIMARY]
      

  2.   

    树型处理在sqlserver里最快的不是这种结构,是:01
    01001
    02
    02002这种结构。
      

  3.   

    --改用这个函数
    create function f_getmergbm()
    returns @re table(id nvarchar(20),mid nvarchar(4000),level int)
    as
    begin
    declare @level int
    set @level=1
    insert into @re select PartsID,PartsID,@level from BCParts
    where PPartsID not in(select PartsID from BCParts)
    while @@rowcount>0
    begin
    set @level=@level+1
    insert into @re select a.PartsID,b.mid+','+a.PartsID,@level
    from BCParts a inner join (select id,mid from @re where level=@level) b
    on a.PPartsID=b.id
    end
    return
    end
    go--查询的时候用
    select a.* from BCParts a inner join dbo.f_getmergbm() b on a.PartsID=b.id order by b.mid
      

  4.   

    举个例子,对于下面的数据:
    A
     |__A1
     |__A2
          |_A21
    B
     |__B1第一种方法的描述为:
    id name  pid
    1  A     0
    2  B     0
    3  A1    1
    4  A2    1
    5  A21   4
    6  B1    2第二种方法的描述为,假设编码规则为1-2-2:
    id     name
    1      A
    2      B
    101    A1
    102    A2
    10201  A21
    201    B1如果要将A2及其所有的子移动到B1下面,第一种描述只需要将A2的pid改为6就行了.
    而第二种方法,因为每级的编码长度都不相同,所以很难处理到.但在统计上,从我的《树形数据处理方案》的处理方法就可以看出,它实际上是通过实时生成类似方法2的编码来处理的。
    所以当然第二种方案在统计上更有优势。