if object_id('t_insertpath') <>0 drop trigger t_insertpath go create trigger t_insertpath on t_tree for insert as begin declare @level int set @level=1 if exists(select pid from inserted where pid is null or pid='') insert into t_treepath select id ,@level,id from inserted else if exists(select * from inserted,t_treepath where inserted.pid=t_treepath.id) insert into t_treepath select inserted.id,t_treepath.level+1,t_treepath.path+inserted.id from inserted,t_treepath where inserted.pid=t_treepath.id else begin print '插入节点的父节点不存在,插入取消' rollback end end --删除一个节点的时候,同时对节点的路径进行删除 if object_id('t_deleteNode') <>0 drop trigger t_deleteNode go create trigger t_deleteNode on t_tree for delete as begin declare @count int,@startpos int,@len int select @count=count(*) from deleted if @count=(select count(*) from t_treepath) delete from t_treepath else if @count=1 begin select @startpos=len(path)-len(deleted.id),@len=len(deleted.id) from deleted,t_treepath where deleted.id=t_treepath.id
update t_tree set pid=(select pid from deleted) where pid=(select id from deleted)
update t_treepath set level=level-1, path=stuff(path,@startpos+1,@len,'') where id in (select id from t_treepath where path like (select path from t_treepath,deleted where t_treepath.id=deleted.id)+'%')
delete from t_treepath where id=(select id from deleted) end else--删除多行的时候,没有想到很好的判断条件,所以就姑且认为删除多行的时候就是删除某个节点及该节点的所有子节点 delete from t_treepath where id in (select id from deleted) end --更新节点的时候,同时更新该节点的路径 if object_id('t_updatePath') <>0 drop trigger t_updatePath go create trigger t_updatePath on t_tree for update as begin --此人很懒,没有写 end --按照广度搜素
select t_tree.* from t_tree,t_treepath where t_tree.id=t_treepath.id order by level,t_treepath.id
--按照深度搜素 select t_tree.* from t_tree,t_treepath where t_tree.id=t_treepath.id order by path
--显示树形数据
select space(level*2)+'|--'+name from t_tree,t_treepath where t_tree.id=t_treepath.id order by path
--查找子节点 select t_tree.* from t_tree,t_treepath where t_tree.id=t_treepath.id and path like'%002%'
select t_tree.* from t_tree,t_treepath where t_tree.id=t_treepath.id and path like '%'+(select id from t_tree where name='烟台市')+'%'
--查找父节点
select t_tree.* from t_tree,t_treepath where t_tree.id=t_treepath.id and '001002' like path+'%'
select t_tree.* from t_tree,t_treepath where t_tree.id=t_treepath.id and (select path from t_tree,t_treepath where t_tree.id=t_treepath.id and name='烟台市') like path+'%' --删除的时候,要删除某个节点的所有子节点
delete from t_tree where id in ( select id from t_tree,t_treepath where t_tree.id=t_treepath.id and path like'%002%')
举一个删除子树的例子: 树:ORI(ID INT,PID INT,NAME VARCHAR(100)) 可以用两种方法: 一种采用单节点函数: create function ORI_INCLUDEID(ID INT,IID INT) --判断指定节点(ID)的路径中是否包含需要查找的节点(IID),返回0(不包含)、1(包含) returns int as begin ... end go --删除子树 delete ORI where ORI_INCLUDEID(id,3)=1