[quote="junjie314"] 有谁能不能说具体的实现!~~现在如果光排序的那没问题,但是各节点之间不是有顺序的吗??这个顺序是可以改的..现在主要问题是如果要改这个的话就比较麻烦了..比如有两个父节点顺序是23和38 现在把23这个改成39的话..那23下面的所有子节点都要修改..
这个好象比较麻烦,要么是我设计的问题???[/quote]
首先创建一个SQL函数:weightValue,如下
[code]CREATE FUNCTION weightValue(@idValue int) RETURNS bigint AS
BEGIN
DECLARE @return bigint
DECLARE @fatherID int
DECLARE @number int
DECLARE @menuPath VARCHAR(50)
DECLARE @treeLevel int
DECLARE @weightLevel bigint
SET @return = 0
SET @weightLevel = 1
SELECT @fatherID=fatherID,@menuPath=menuPath,@number=number FROM treeTable WHERE id=@idValue
SELECT @treeLevel=len(@menuPath)-len(replace(@menuPath,'/',''))
WHILE(@treeLevel<9) --此处9为目录层次数,经测试bigInt可以支持9级目录,再多目录层次就会出现益出
BEGIN
SET @weightLevel=@weightLevel*100
SET @treeLevel=@treeLevel+1
END
SET @return=@number*@weightLevel
IF(@fatherID = 1)
BEGIN
RETURN(@return)
END
RETURN ([dbo].weightValue(@fatherID)+@return)
END[/code]
然后一个简单的查询SQL即可,如下:
[code]SELECT id,fatherId,menuPath,number FROM treeTable ORDER BY [dbo].weightValue(id)[/code]
查询结果就是想要的排列顺序,结果如下,因为结果是实时查询,所以节点可以随时配置
[code]112 1 /112 23
114 112 /112/114 1
116 114 /112/114/116 8
115 114 /112/114/115 9
113 112 /112/113 2
107 1 /107 38
109 107 /107/109 1
111 109 /107/109/111 4
110 109 /107/109/110 5
108 107 /107/108 2[/code]