您的位置:首页 > 其它

查找指定节点的所有父节点的示例函数

2010-06-22 17:44 543 查看
CREATE FUNCTION f_Pid(@ID char(3))

RETURNS @t_Level TABLE(ID char(3),Level int)

AS

BEGIN

DECLARE @Level int

SET @Level=1

INSERT @t_Level SELECT @ID,@Level

WHILE @@ROWCOUNT>0

BEGIN

SET @Level=@Level+1

INSERT @t_Level SELECT a.PID,@Level

FROM tb a,@t_Level b

WHERE a.ID=b.ID

AND b.Level=@Level-1

END

RETURN

END

GO

CREATE FUNCTION f_Pid(@ID char(3))

RETURNS @t_Level TABLE(ID char(3))

AS

BEGIN

INSERT @t_Level SELECT @ID

SELECT @ID=PID FROM tb

WHERE ID=@ID

AND PID IS NOT NULL

WHILE @@ROWCOUNT>0

BEGIN

INSERT @t_Level SELECT @ID

SELECT @ID=PID FROM tb

WHERE ID=@ID

AND PID IS NOT NULL

END

RETURN

END
</PRE>
<PRE class="csharp" name="code"><PRE class="ql" name="code">树形数据深度排序处理示例(递归法)

--测试数据

CREATE TABLE tb(ID char(3),PID char(3),Name nvarchar(10))

INSERT tb SELECT '001',NULL ,'山东省'

UNION ALL SELECT '002','001','烟台市'

UNION ALL SELECT '004','002','招远市'

UNION ALL SELECT '003','001','青岛市'

UNION ALL SELECT '005',NULL ,'四会市'

UNION ALL SELECT '006','005','清远市'

UNION ALL SELECT '007','006','小分市'

GO

--广度搜索排序函数

CREATE FUNCTION f_Sort(@ID char(3)=NULL,@sort int=1)

RETURNS @t_Level TABLE(ID char(3),sort int)

AS

BEGIN

DECLARE tb CURSOR LOCAL

FOR

SELECT ID FROM tb

WHERE PID=@ID

OR(@ID IS NULL AND PID IS NULL)

OPEN TB

FETCH tb INTO @ID

WHILE @@FETCH_STATUS=0

BEGIN

INSERT @t_Level VALUES(@ID,@sort)

SET @sort=@sort+1

IF @@NESTLEVEL<32 --如果递归层数未超过32层(递归最大允许32层)

BEGIN

--递归查找当前节点的子节点

INSERT @t_Level SELECT * FROM f_Sort(@ID,@sort)

SET @sort=@sort+@@ROWCOUNT --排序号加上子节点个数

END

FETCH tb INTO @ID

END

RETURN

END

GO

--显示结果

SELECT a.*

FROM tb a,f_Sort(DEFAULT,DEFAULT) b

WHERE a.ID=b.ID

ORDER BY b.sort

/*--结果

ID PID Name

------ --------- ----------

001 NULL 山东省

002 001 烟台市

004 002 招远市

003 001 青岛市

005 NULL 四会市

006 005 清远市

007 006 小分市
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: