createtable Tree(nId smallint, NodeName nvarchar(16), pId smallint) insert Tree select1, '中国', NULL unionallselect2, '北京', 1 unionallselect3, '上海', 1 unionallselect4, '湖北', 1 unionallselect5, '湖南', 1 unionallselect6, '武汉', 4 unionallselect7, '孝感', 4 unionallselect8, '长沙', 5 unionallselect9, '岳阳', 5 unionallselect10, '海淀区', 2 unionallselect11, '朝阳区', 2 unionallselect12, '上地', 10 unionallselect13, '西三旗', 10 go createprocedure sp_GetNoedsByRootID @nIdsmallint as begin with NewTree(nId, NodeName, pId) as ( select*from Tree where nId=@nId unionall select T.*from Tree T join NewTree NT on T.pId=NT.nId ) select NT.nId, NT.NodeName, PT.NodeName as[ParentName] from NewTree NT join Tree PT on NT.pId=PT.nId end go createprocedure sp_DelNoedsByRootID @nIdsmallint as begin declare@sqlnvarchar(max) set@sql=' with NewTree(nId, NodeName, pId) as ( select * from Tree where nId=@nId union all select T.* from Tree T join NewTree NT on T.pId=NT.nId ) delete Tree from Tree T join NewTree NT on T.nId=NT.nId ' exec sp_executesql @sql, N'@nId smallint', @nId end go --查找节点及子节点 exec sp_GetNoedsByRootID 2 --删除节点及子节点 exec sp_DelNoedsByRootID 2 select*from Tree droptable Tree dropprocedure sp_GetNoedsByRootID, sp_DelNoedsByRootID
在SQL2000下实现类似功能的代码:
--测试数据 CREATETABLE tb(ID char(3),PID char(3),Name nvarchar(10)) INSERT tb SELECT'001',NULL ,'山东省' UNIONALLSELECT'002','001','烟台市' UNIONALLSELECT'004','002','招远市' UNIONALLSELECT'003','001','青岛市' UNIONALLSELECT'005',NULL ,'四会市' UNIONALLSELECT'006','005','清远市' UNIONALLSELECT'007','006','小分市' GO --查询指定节点及其所有子节点的函数 CREATEFUNCTION f_Cid(@IDchar(3)) RETURNS@t_LevelTABLE(ID char(3),Levelint) AS BEGIN DECLARE@Levelint SET@Level=1 INSERT@t_LevelSELECT@ID,@Level WHILE@@ROWCOUNT>0 BEGIN SET@Level=@Level+1 INSERT@t_LevelSELECT a.ID,@Level FROM tb a,@t_Level b WHERE a.PID=b.ID AND b.Level=@Level-1 END RETURN END GO --调用函数查询002及其所有子节点 SELECT a.* FROM tb a,f_Cid('002') b WHERE a.ID=b.ID /**//*--结果 ID PID Name ------ ------- ---------- 002 001 烟台市 004 002 招远市 --*/