您的位置:首页 > 编程语言 > ASP

[asp.net+Sql]关于树的排序

2009-05-24 09:52 337 查看
在大部分的大型程序里都会用到树,种树这个鸟活让我头大了几天。
树的算法大家应该都很清楚了,递归就可以了,但是头疼的就是树的排序,在添加、修改父节点,节点移动都要重新计算树的排序,从而是代码量大大提高。于是决定用SQL去做这个烦琐的事情,用了2个触发器,一个存储过程完成了树的排序。

Create PROCEDURE ModuleBase_move
@ModID int,@Menth nvarchar(5),@result nvarchar(30) output
As
declare @ParentID int,@JHSQNC int,@TmpModID int
select @ParentID = ParentID from ModuleBase where ModID = ModID

DECLARE ModuleBase_Cursor CURSOR SCROLL FOR
SELECT ModID FROM ModuleBase WHERE ParentID=@ParentID ORDER BY SQNC
OPEN ModuleBase_Cursor

FETCH NEXT FROM ModuleBase_Cursor INTO @TmpModID
WHILE @@FETCH_STATUS = 0
BEGIN
if(@TmpModID=@ModID)
begin
if(@Menth=’up’)
begin
FETCH PRIOR FROM ModuleBase_Cursor INTO @TmpModID
end
else
begin
FETCH NEXT FROM ModuleBase_Cursor INTO @TmpModID
end
select @JHSQNC=SQNC FROM ModuleBase where ModID=@TmpModID
update ModuleBase Set SQNC=(select SQNC from ModuleBase where ModID=@ModID) where ModID=@TmpModID
update ModuleBase Set SQNC=@JHSQNC where ModID=@ModID
FETCH LAST FROM ModuleBase_Cursor into @TmpModID
End
FETCH NEXT FROM ModuleBase_Cursor into @TmpModID
END

CLOSE ModuleBase_Cursor
DEALLOCATE ModuleBase_Cursor

IF @@ERROR <> 0
BEGIN
set @result=’操作失败’
END
ELSE
BEGIN
set @result=’操作成功’
END

GO
存储过程是为了在子节点在父节点下上下移动时候使用,
传入值两个@ModID int------节点编号
@Menth nvarchar(5)-------移动方式up或者down
返回值@result,用来输出是否移动成功
实现原理是将移动节点的父节点按顺序排列,如果上移动,找到该移动节点,与上条记录的排序值互换,下移则相反!

这样操作起来在程序的代码中可以不必考虑节点排序的问题,一切让SQL自己做
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: