table:
t_news_sort
字段:
id
ParentId
SortName
path一个分类表,path是我后加的字段,现在我想当执行insert 或update时,可以记录下这个树的路径,path
的路径应该是象下面这样
其数据为
id     parentid    sortname    path
1         0           t1        1
2         1           t1_1      1,2
3         2           t1_1_1    1,2,3.......请问高手应该如何写?

解决方案 »

  1.   

    path的意思,从根结点开始记录每一级的节点,就好像每个文件所在的文件夹的路径一样。比如:0 0
    1 0
    2 03 0,1
    4 0,1
    5 0,1,3
    6 0,1,3
    5的父节点是 3 ,5的父节点是 1 。那么我想显示 1的所有节点,加一个 like 就可以了 , like '0,1%'。
      

  2.   

    不会乱套,只是对insert和update进行操作,而且只是取父id的path记录进行操作
      

  3.   

    这个触发器只是取得当前的ParentId,并根据这个ParentId找到上一级,取得path的值再插入回来,是很难嘛
      

  4.   

    假设你的原有数据的path都是正确的,触发器可以如下:create trigger tr_tablename
    on tablename
    for insert,update
    as
    set nocount on
    if update (id) or update(parentid)
    begin
       update a
       set path=b.path+','+cast(a.id as varchar)
       from tablename a,tablename b,inserted i
       where a.id=i.id
       and a.parentid=b.id
    end    
    gops:最好不要打开数据的的递归触发器选项再PS:应该限制已经有下级的记录的parentid修改,如果允许修改,那就会要求触发器可能修改本记录以及其下级的记录的path,以上触发器未实现这个功能
      

  5.   

    顶一下
    等高手来写吧~~
    insert 时简单点
    update 难实现
    ^_^ ^_^ ^_^
      

  6.   

    以下触发器实现允许已经有下级的记录的parentid修改,但是初发期的工作量增加了,可能影响效率,是否限制这样的修改搂主自己权衡考虑.create trigger tr_tablename
    on tablename
    for insert,update
    as
    set nocount on
    declare @t table (
    id int,
    path varchar(50),
    lev int
    )declare @lev int
    set @lev=0if update (id) or update(parentid)
    begin
       insert @t
       select a.id,b.path+','+cast(a.id as varchar),0
       from tablename a,tablename b,inserted i
       where a.id=i.id
       and a.parentid=b.id
       while exists (select 1 from @t a,tablename b where a.id=b.parentid and a.lev=@lev)
       begin
          insert @t
          select a.id,b.path+','+cast(a.id as varchar),@lev+1
          from tablename a,@t b
          where a.parentid=b.id
          and b.lev=@lev
          set @lev=@lev+1
       end
       
       update a
       set path=b.path
       from tablename a,@t b
       where a.id=b.id
    end    
    go
      

  7.   

    在提醒一下:
      以上所写都是在原有数据的path是正确的情况下的,如果你的数据尚未正确,建议在把数据该正确后再挂上触发器,触发器只能做到在正确的情况下保持正确,不能在不正确的情况下更正正确。  修改数据可以考虑用函数,求path的函数应该再有很多人写过,这里不多写了