PROCEDURE GetDeptTree

CREATE PROCEDURE dbo.GetDeptTree

(

@Code varchar(10)

)

AS

BEGIN

-- 1. 建立暫存表格(hold the parent/children-items)

CREATE TABLE #Relation

(

Code varchar(10), -- 部門代碼, 請改成用varchar, 不要使用char

Name nvarchar (200), -- 部門名稱

Dept_Level int , -- 部門層級(非必要)

parentCode varchar(10), -- 上層(父)部門代碼

Runs int -- 記錄是在第幾次執行時,存入暫存資料表

)

-- 2. 建立錨點(Anchor)

-- 將所輸入的部門存入暫存資料表

-- 因輸入的部門為本次展開的最上層的部門,因此其上層部門代碼設為NULL

-- Runs設為0,代表為初始化條件

INSERT INTO #Relation

( Code, Name, parentCode, Runs)

SELECT D.Code, D.Name, NULL, 0

FROM Dept D

WHERE 1=1

AND Code = @Code --'A000'

-- 3. 逐層展開(Loop as long as we find uninserted children)

WHILE @@ROWCOUNT > 0

-- 3.3. 重複執行,直至無任何資料被存入

BEGIN

-- Insert children that are not already in the temporary table

INSERT INTO #Relation

(Code, Name, parentCode, Runs)

SELECT T.Code, T.Name, T.parentCode, T.Runs +1

FROM #Relation R RIGHT JOIN -- 3.2. 3.1所取得的下屬部門,剔除已存在於暫存資料表的值

(

-- 3.1. 找出暫存資料表所有的下屬部門,當執行第二次時則會有重複值

SELECT T.Code, T.Name, T.parentCode, P.Runs

FROM Dept T, #Relation P

WHERE 1=1

AND P.Code = T.parentCode

) T

ON R.Code = T.Code

WHERE 1=1

AND R.Code IS NULL

END

-- 4. 傳回暫存資料表

SELECT P.Code, P.Dept_Level, P.parentCode, P.Name

FROM #Relation P

WHERE 1=1

ORDER BY P.Code, P.Dept_Level

-- 刪除暫存資料表 (非必要,但建議採行)

DROP TABLE #Relation

END

GO