高分求算法

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写了上面的算法,但是因为无法调试,所以不知道问题出在什么地方,有高手能帮我解决吗?这个问题牵涉整个项目的进度,我现在很急,所以高分求解!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
...全文
8 点赞 收藏 4
写回复
4 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
CCEO 2003-09-19
output
看清楚点
回复
njzwb 2003-09-19
你们的回答都不全面,没有给出具体的解决办法,现在我用单一路线的节点测试了一下
结果是递归调用根本没有执行,不知道是什么原因.
后来我发现还少写了一个语句:

--更新父亲节点字符串(删除已经分解出的节点)
set @tempNodeIDArray = RIGHT(@tempNodeIDArray, LEN(@tempNodeIDArray) -@tempNodeIDIndex);
回复
CCEO 2003-09-19
@ResultNodeIDArray变量应该有问题,在多个父节点的情况,因为你的结果都放在@ResultNodeIDArray一个变量,当一条路不同的时候没有恢复以前的@ResultNodeIDArray

建议改成用函数
回复
CCEO 2003-09-19
--递归调用
exec sp_GetNodeIDArray @StartNodeID, @EndNodeID, @ProjectTypeID, @VersionID, @ResultNodeIDArray;
-->
--递归调用
exec sp_GetNodeIDArray @StartNodeID, @EndNodeID, @ProjectTypeID, @VersionID, @ResultNodeIDArray output;

这是明显的错误
其它的需要时间

回复
相关推荐
发帖
疑难问题
创建于2007-09-28

2.1w+

社区成员

MS-SQL Server 疑难问题
申请成为版主
帖子事件
创建了帖子
2003-09-19 10:23
社区公告
暂无公告