使用ms sql以來自認為寫的最好的過程
/*
寫在前面:是從一個自引用的表中把一個樹狀結構的層次關係展現出來.沒有使用遞迴.
*/
/*
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
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/47869/viewspace-796369/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ms sql server儲存過程目前使用模板SQLServer儲存過程
- MS SQL Server儲存過程SQLServer儲存過程
- Ms Sql Server查詢儲存過程中的內容SQLServer儲存過程
- 通過錯誤的sql來測試推理sql的解析過程SQL
- 通過錯誤的sql來測試推理sql的解析過程(二)SQL
- 為什麼說程式設計是有史以來最好的工作程式設計
- 怎樣使用過程自動化來實現過程的習慣性和永續性?
- SQL 解析的過程SQL
- 編寫和優化SQL Server的儲存過程優化SQLServer儲存過程
- 一次SQL Performance Analyzer的使用過程SQLORM
- SQL Server儲存過程中raiserror的使用SQLServer儲存過程AIError
- 資料庫分庫,原來 SQL 和儲存過程寫的報表咋辦?資料庫SQL儲存過程
- 通用元件:自動更新套件的使用過程元件套件
- 使用mysqldump以SQL格式來dump資料MySql
- 來自瑞士設計最好的智慧手錶
- 美團面試官問:寫一個你認為最好的單例模式?於是我寫了7個面試單例模式
- oracle自定義過程來獲得完整的sql語句OracleSQL
- 由Delphi程式改寫Sql(2000)的儲存過程SQL儲存過程
- oracle處理SQL的過程OracleSQL
- 小寫轉大寫金額儲存過程[SQL SERVER]儲存過程SQLServer
- 不錯的軟體,我來寫過程。:) (2千字)
- c語言程式的執行過程(以輸出hello,world為例)C語言
- MySQL儲存過程裡動態SQL的使用UXMySql儲存過程UX
- 使用error stack 抓取儲存過程的當前SQLError儲存過程SQL
- 為什麼我認為《變數》是最好的塔防之一變數
- 為MS SQL 2005新增一個使用者adminSQL
- HP MS1000換硬碟過程硬碟
- 儲存過程的引數可以使用sql的函式儲存過程SQL函式
- Oracle Sql loader 匯入資料指令碼的編寫過程OracleSQL指令碼
- 優良的sql語句在書寫過程中要注意的細節SQL
- SQL——以面向集合的思維方式來思考SQL
- 使用10046 來了解oracle的啟動過程Oracle
- 谷歌Pixel有史以來拍照最好的手機?樣張尷尬谷歌
- 【技術貼】有史以來最好的序擬主機安全配置
- oracle 寫入資料的過程Oracle
- 一條Sql的執行過程SQL
- 一條sql的優化過程SQL優化
- SQL語句的處理過程SQL