使用ms sql以來自認為寫的最好的過程

wangzh3發表於2005-04-19

/*

寫在前面:是從一個自引用的表中把一個樹狀結構的層次關係展現出來.沒有使用遞迴.

*/

/*
CopyRight 2005 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
---然後上溯
----獲取當前最大處理層次
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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章