SQL Server 2008原生的分層數據類型hierarchyid簡介
SQL Server 2008原生的分層數據類型hierarchyid是本文我們主要要介紹的內容,接下來就讓我們通過實際的例子來介紹它的應用,希望能夠對您有所幫助。
如果是在SQL Server 2000中,我們需要讀取分層結構數據時,不得不借助遞歸。在SQL server 2005中,我們可以使用CTE,當然,好的數據結構設計可以避免你使用CTE,請看這里:http://www.cnblogs.com/downmoon/archive/2009/10/23/1588405.html。
如果你是一個數據庫設計新手,那么在sql server 2008中可以使用新的原生分層結構數據hierarchyid。
關于它的詳細說明,請看MSDN:
http://msdn.microsoft.com/zh-cn/library/bb677173%28v=sql.100%29.aspx
http://64.4.11.252/zh-cn/library/bb677173.aspx
http://msdn.microsoft.com/en-us/magazine/cc794278.aspx#id0090037
需要注意的是,它可以改造傳統數據表而成。但不可以實現與XML互相轉換。
下面我們看一個示例:
- if OBJECT_ID('[Category_hierarchyid]') is not null
- drop table [Category_hierarchyid]
- go
- --創建表
- CREATE TABLE [Category_hierarchyid]
- (
- H_ID hierarchyid NOT NULL,
- C_ID INT primary key identity(1000,1) NOT NULL,
- C_Name NVARCHAR(50) NOT NULL,
- Title NVARCHAR(50) NOT NULL
- )
- GO
- TRUNCATE table [Category_hierarchyid]
- GO
- INSERT INTO [Category_hierarchyid]([H_ID],[C_Name],[Title])
- select '/','蔬菜','蔬菜' union all
- select '/1/','根菜類','蔬菜' union all
- select '/2/','葉菜類','蔬菜' union all
- select '/3/','茄果類','蔬菜' union all
- select '/4/','甘藍類','蔬菜' union all
- select '/1/1/','蘿卜','蔬菜' union all
- select '/1/1/','胡蘿卜','蔬菜' union all
- select '/4/2/','甘藍','蔬菜' union all
- select '/2/4/','花椰菜','蔬菜' union all
- select '/3/3/','茄子','蔬菜' union all
- select '/3/3/','番茄','蔬菜' union ALL
- select '/1/1/5/','白蘿卜','蔬菜'
- go
SQL server 2008 中的原生分層數據:hierarchyid
--查看所有的分類
- SELECT * FROM [Category_hierarchyid]
- /*
- H_ID C_ID C_Name Title
- 0x 1000 蔬菜 蔬菜
- 0x58 1001 根菜類 蔬菜
- 0x68 1002 葉菜類 蔬菜
- 0x78 1003 茄果類 蔬菜
- 0x84 1004 甘藍類 蔬菜
- 0x5AC0 1005 蘿卜 蔬菜
- 0x5AC0 1006 胡蘿卜 蔬菜
- 0x85A0 1007 甘藍 蔬菜
- 0x6C20 1008 花椰菜 蔬菜
- 0x7BC0 1009 茄子 蔬菜
- 0x7BC0 1010 番茄 蔬菜
- 0x5AE3 1011 白蘿卜 蔬菜
- */
--查看所有的分類及級別
- SELECT *,H_ID.GetLevel() AS Level FROM [Category_hierarchyid]
- /*
- H_ID C_ID C_Name Title Level
- 0x 1000 蔬菜 蔬菜 0
- 0x58 1001 根菜類 蔬菜 1
- 0x68 1002 葉菜類 蔬菜 1
- 0x78 1003 茄果類 蔬菜 1
- 0x84 1004 甘藍類 蔬菜 1
- 0x5AC0 1005 蘿卜 蔬菜 2
- 0x5AC0 1006 胡蘿卜 蔬菜 2
- 0x85A0 1007 甘藍 蔬菜 2
- 0x6C20 1008 花椰菜 蔬菜 2
- 0x7BC0 1009 茄子 蔬菜 2
- 0x7BC0 1010 番茄 蔬菜 2
- 0x5AE3 1011 白蘿卜 蔬菜 3
- */
--查看根菜類及其子分類
- DECLARE @Parent hierarchyid
- SELECT @Parent=H_ID FROM [Category_hierarchyid] WHERE C_ID=1001
- ----PRINT @Parent.ToString()
- SELECT *,H_ID.GetLevel() AS Level FROM [Category_hierarchyid]
- WHERE H_ID.IsDescendantOf(@Parent)=1
- /*
- H_ID C_ID C_Name Title Level
- 0x58 1001 根菜類 蔬菜 1
- 0x5AC0 1005 蘿卜 蔬菜 2
- 0x5AC0 1006 胡蘿卜 蔬菜 2
- 0x5AE3 1011 白蘿卜 蔬菜 3
- */
--查看胡蘿卜及其所有父分類
- DECLARE @Son hierarchyid
- SELECT @Son=H_ID FROM [Category_hierarchyid] WHERE C_ID=1006
- SELECT *,H_ID.GetLevel()AS Level FROM [Category_hierarchyid]
- WHERE @Son.IsDescendantOf(H_ID)=1
- /*
- H_ID C_ID C_Name Title Level
- 0x 1000 蔬菜 蔬菜 0
- 0x58 1001 根菜類 蔬菜 1
- 0x5AC0 1005 蘿卜 蔬菜 2
- 0x5AC0 1006 胡蘿卜 蔬菜 2
- */
關于SQL Server 2008原生的分層數據類型hierarchyid的知識就介紹到這里了,希望本次的介紹能夠對您有所收獲!
【編輯推薦】