高分求算法
njzwb 2003-09-19 10:23:17 CREATE PROCEDURE sp_GetNodeIDArray --获得指定起始,终止节点之间的所有节点ID
@StartNodeID int, --起始节点ID
@EndNodeID int, --终止节点ID
@ProjectTypeID int, --项目类型ID
@VersionID int, --版本ID
@ResultNodeIDArray varchar(100) OUTPUT --结果节点字符串(以 '-' 作为分隔)
AS
declare
@tempNodeIDArray varchar(100),
@tempNodeIDIndex int,
@TempNodeID varchar(4);
begin
--begin transaction
set @ResultNodeIDArray = '';
--获得终止节点的父亲节点字符串
set @tempNodeIDArray = (select ParentNodeIDArray from _tblNodeRelationAidInfo where (NodeID = @EndNodeID) and (ProjectTypeID = @ProjectTypeID) and (VersionID = @VersionID));
set @tempNodeIDIndex = CHARINDEX('-',@tempNodeIDArray,0);
if @tempNodeIDIndex = 0 --没有节点分隔符号,表明 ParentNodeIDArray 只有一个节点
begin
if CAST(@tempNodeIDArray AS INT) = @StartNodeID return --如果其父亲节点就是起始节点,递归就结束
else
begin
--只有一个父亲节点,那么直接将 @tempNodeIDArray 置为 EndNodeID
set @EndNodeID = @tempNodeIDArray;
--保存父亲节点ID
set @ResultNodeIDArray = @ResultNodeIDArray + '-' + @tempNodeIDArray;
--递归调用
exec sp_GetNodeIDArray @StartNodeID, @EndNodeID, @ProjectTypeID, @VersionID, @ResultNodeIDArray;
end
end
else --ParentNodeIDArray 中有多个节点 then
while Len(@tempNodeIDArray) > 0
begin
--分解 @TempNodeID 分解出其中的父亲一个作为 EndNodeID
set @TempNodeID = LEFT(@tempNodeIDArray, @tempNodeIDIndex - 1);
--分解 ParentNodeIDArray 分解出其中的父亲一个作为 EndNodeID
set @EndNodeID = @TempNodeID;
--保存分解出的父亲节点ID
set @ResultNodeIDArray = @ResultNodeIDArray + '-' + @TempNodeID;
--更新父亲节点字符串(删除已经分解出的节点)
set @tempNodeIDArray = RIGHT(@tempNodeIDArray, LEN(@tempNodeIDArray) - @tempNodeIDIndex);
--递归调用
exec sp_GetNodeIDArray @StartNodeID, @EndNodeID, @ProjectTypeID, @VersionID, @ResultNodeIDArray;
end
-- commit transaction
end
GO
这是一个利用存储过程的递归调用来获取一个指定的起始和终止节点之间的节点的算法
tblNodeRelationAidInfo 表存储节点之间的关系
各字段和值如下,表示了一个典型的节点拓扑关系
NodeID NodeName ProjectTypeID VersionID ParentNodeIDArray ChildNodeIDArray
1 节点1 1 2000 NULL 2
2 节点2 1 2000 1 3-4
3 节点3 1 2000 2 5
4 节点4 1 2000 2 6
5 节点5 1 2000 3 7
6 节点6 1 2000 4 7
7 节点7 1 2000 5-6 8
8 节点8 1 2000 7 NULL
节点之间的关系由这张表维护,现在我的问题是我要找出例如节点2和节点7之间的节点(3,4,5,6);我用T-SQL写了上面的算法,但是因为无法调试,所以不知道问题出在什么地方,有高手能帮我解决吗?这个问题牵涉整个项目的进度,我现在很急,所以高分求解!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!