有这样一个需求,单击删除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