TreeView递归删除子节点

来源:luqidong 发布时间:2013-09-02 21:24:43 点击数:
有这样一个需求,单击删除TreeView中某个选中的节点时,要求把选中的节点本身与选中节点的子节点(直接子节点和孙子节点)同时也删除掉。 首先想到的是递归实现。可是数据库递归。尼玛。不会啊啊啊~~ 下面附上自己的解决方法,有更好的,烦请以评论方式提供。
 
现假设删除我的文档子节点。那么最后的结果应该只剩下Mid 为0和14的两条记录。
附上我的解决方法。
create proc usp_digui
@parentid nvarchar(50)
as
begin
    /*
        1 传递的参数直接插入表A
        while(true)
        {
            2 判断表parendId为表A中的数据是否含有直接子元素,为0时,直接跳出
            3 parendId为表A的子元素Mid插入到表B中
            4 再次将parendId为表A的子元素Mid插入到临时表C中
            5 清空表A数据,从表C中取出之前留下的子元素做为parendID进行再次查询
            6 清空临时表
        }
        7 删除表Mid 为表B的记录和第一次参数传进来的本身
    */
    declare @selfid nvarchar(50)
    set @selfid = @parentid
 
    declare @preDelTbl table(delid nvarchar(50))
 
    declare @tbl table(tempid nvarchar(50))
    insert into @tbl values (@parentid)
 
    declare @count int 
    set @count = 0 
    
    --中转临时表
    declare @tempTbl table(tid nvarchar(50))
    while(1=1)
    begin    
        --查询传递的一组parendId的直接子元素个数,为0则直接跳出
        select @count = count(*) from tblTest where ParentId in(select tempid from @tbl)
        if (@count=0)
        begin
            break
        end
        else
        begin    
            --清空中专临时表数据
            delete @tempTbl
            --把parendId的直接子元素插入到待删除表中
            insert into @preDelTbl select mid from tblTest where ParentId in(select tempid from @tbl)
            --保存本次的直接子元素到临时表,提供给下一次循环使用
            insert into @tempTbl select mid from tblTest where ParentId in(select tempid from @tbl)
            delete @tbl 
            insert into @tbl select tid from @tempTbl
        end
    end
    --select delid from @preDelTbl union select @selfid
    delete from tblTest where Mid in(select delid from @preDelTbl union select @selfid)
end