ITPub博客

首页 > 数据库 > 数据库开发技术 > 使用ms sql以来自认为写的最好的过程

使用ms sql以来自认为写的最好的过程

原创 数据库开发技术 作者:wangzh3 时间:2005-04-19 12:14:07 0 删除 编辑

/*

写在前面:是从一个自引用的表中把一个树状结构的层次关系展现出来.没有使用递归.

*/

/*
CopyRight 2005 www.zte.com.cn All rights reserved.
系统名称:互联星空
子系统名称:资源管理子系统
描述:根据资源产品id检索资源节点信息
作者:王志宏
创建日期:2005-04-19
修改:
*/
ALTER PROCEDURE dbo.Up_Res_SearchResourceNodeByResourceProductID
(
@ResourceProductID int /*资源产品id*/
)
AS
declare @current_deal_level int /*当前处理层次*/
declare @deal_flag int /*处理标志 1为需要处理,0为不需要*/
---创建临时表,用于存放ResourceNode信息,并增加字段deal_level表示是否已经处理
create table #tmp_ResourceNode
(
ResourceNodeID int not null,
ResourceNodeCode varchar(256) not null,
ResourceNodeName varchar(64) null,
Description varchar(256) null,
ResourceID int null,
NodeType int null default 3,
ParentNodeID int null default 0,
RegionCode varchar(256) null,
CreateDateTime smalldatetime null,
NodeLevel int null default 0,
Reserve1 varchar(256) null,
Reserve2 varchar(256) null,
Reserve3 varchar(256) null,
deal_level int
)
---首先根据资源产品id获取资源节点信息
insert into #tmp_ResourceNode
select
rn.ResourceNodeID ,
rn.ResourceNodeCode ,
rn.ResourceNodeName ,
rn.Description ,
rn.ResourceID ,
rn.NodeType ,
rn.ParentNodeID ,
rn.RegionCode ,
rn.CreateDateTime ,
rn.NodeLevel ,
rn.Reserve1 ,
rn.Reserve2 ,
rn.Reserve3 ,
0
from ResourceNode rn,ResourceProductNode rpn
where rn.ResourceNodeID = rpn.ResourceNodeID
and rpn.ResourceProductID=@ResourceProductID
---然后上溯
----获取当前最大处理层次
select @current_deal_level=max(deal_level) from #tmp_ResourceNode

---判断当前最大处理层次对应的数据是否有ParentNodeID<>0的,如果有,需要继续上溯,否则,不需要
if exists (select * from #tmp_ResourceNode trn where trn.deal_level=@current_deal_level and trn.ParentNodeID<>0)
set @deal_flag=1
else
set @deal_flag=0

while(@deal_flag=1)
begin
----把从ResourceNode中检索的数据放入到临时表,deal_level=@current_deal_level+1
insert into #tmp_ResourceNode
select
rn.ResourceNodeID ,
rn.ResourceNodeCode ,
rn.ResourceNodeName ,
rn.Description ,
rn.ResourceID ,
rn.NodeType ,
rn.ParentNodeID ,
rn.RegionCode ,
rn.CreateDateTime ,
rn.NodeLevel ,
rn.Reserve1 ,
rn.Reserve2 ,
rn.Reserve3 ,
@current_deal_level+1
from ResourceNode rn,#tmp_ResourceNode trn
where trn.deal_level=@current_deal_level
and trn.ParentNodeID<>0
and trn.ParentNodeID=rn.ResourceNodeID

----获取当前最大处理层次
select @current_deal_level=max(deal_level) from #tmp_ResourceNode

---判断当前最大处理层次对应的数据是否有ParentNodeID<>0的,如果有,需要继续上溯,否则,不需要
if exists (select * from #tmp_ResourceNode trn where trn.deal_level=@current_deal_level and trn.ParentNodeID<>0)
set @deal_flag=1
else
set @deal_flag=0

end

/*把结果检索出来,除deal_level字段distinct,得出整个节点的路径集合*/
select distinct
trn.ResourceNodeID ,
trn.ResourceNodeCode ,
trn.ResourceNodeName ,
trn.Description ,
trn.ResourceID ,
trn.NodeType ,
trn.ParentNodeID ,
trn.RegionCode ,
trn.CreateDateTime ,
trn.NodeLevel ,
trn.Reserve1 ,
trn.Reserve2 ,
trn.Reserve3
from #tmp_ResourceNode trn





[@more@]

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/47869/viewspace-796369/,如需转载,请注明出处,否则将追究法律责任。

下一篇: 又快到五一
请登录后发表评论 登录
全部评论
  • 博文量
    301
  • 访问量
    10831740