-2010-05-27(東升)
SQL SERVER 2008 新資料庫類型hierarchyid
SQL SERVER 2008引入了新的hierarchyid資料類型,可以用它來做本地存儲并且在樹層次
結構中管理其位置.隻用這個函數能簡潔地表示層次結構中的位置.該函數提供的一些内置的函
數方法可以操作和周遊層次結構,使得存儲和查詢分層資料更為容易,而不需要像那樣通過
CTE遞歸來獲得.
該類型其實是一個CLR自定義資料類型依次打開:資料庫->系統資料庫->master->可程式設計性
->類型->系統資料類型->CLR資料類型->hierarchyid,可以看到該資料類型.
于hierarchyid有關的一些函數主要有:
GetAncestor :取得某一個級别的祖先
GetDescendant :取得某一個級别的子代
GetLevel :取得級别
GetRoot :取得根
IsDescendantOf :判斷某個節點是否為某個節點的子代
Parse :将字元串轉換為hierarchyid。該字元串的格式通常都是/1/這樣的
Read :Read 從傳入的BinaryReader 讀取SqlHierarchyId 的二進制表示形式,并将
SqlHierarchyId 對象設定為該值。不能使用Transact-SQL 調用Read。請改
為使用CAST 或CONVERT。
GetReparentedValue :可以用來移動節點(或者子樹)
ToString :将hierarchyid轉換為字元串,與parse正好相反
Write : 将SqlHierarchyId 的二進制表示形式寫出到傳入的BinaryWriter 中。無法通
過使用Transact-SQL 來調用Write。請改為使用CAST 或CONVERT。
以下就該新類型做一些示範
*/
USE TESTDB
GO
CREATE TABLE TEST(
[PHASE] hierarchyid NOT NULL,
LVL AS [PHASE].GetLevel(),
USERID INT NOT NULL,
USERNAME VARCHAR(50) NOT NULL
)
--接着插入一個根
INSERT TEST([PHASE],USERID,USERNAME)
VALUES('/',1001,'東升')--'/'被用來表示層次的根,會自動轉換成二進制格式
SELECT * FROM TEST
/* 結果
PHASE LVL USERID USERNAME
------ ------ --------- ----------
0x 0 1001 東升
(1 行受影響)
查詢後應該發現'/'被重新定義成x十六進制值.
使用斜杠字元來表示層次路徑,一個表示的是根,用斜杠分隔的整數值來組成連續的層次.
插入小弟
VALUES('/1/',1002,'洋芋')
VALUES('/2/',1003,'紅太狼')
--以上條資料時同級别的
/*
PHASE LVL USERID USERNAME
------- ------ --------- -----------
0x 0 1001 東升
0x58 1 1002 洋芋
0x68 1 1003 紅太狼
(3 行受影響)
--同樣可以使用GetDescendant方法來填充[PHASE]
DECLARE @PARENTPHASE hierarchyid, @Child1 hierarchyid
SELECT @PARENTPHASE= CONVERT(hierarchyid,'/1/')
VALUES(@PARENTPHASE.GetDescendant(NULL,NULL),1004,'洋芋小弟1')
SELECT @Child1 = CAST('/1/1/' AS hierarchyid)
VALUES(@PARENTPHASE.GetDescendant(@Child1,NULL),1005,'洋芋小弟2')
SELECT [PHASE].ToString() AS [PHASE] ,LVL,USERID,USERNAME FROM TEST
ORDER BY [PHASE]