SQL Server 2008原生的分層數(shù)據(jù)類(lèi)型hierarchyid簡(jiǎn)介
SQL Server 2008原生的分層數(shù)據(jù)類(lèi)型hierarchyid是本文我們主要要介紹的內(nèi)容,接下來(lái)就讓我們通過(guò)實(shí)際的例子來(lái)介紹它的應(yīng)用,希望能夠?qū)δ兴鶐椭?/p>
如果是在SQL Server 2000中,我們需要讀取分層結(jié)構(gòu)數(shù)據(jù)時(shí),不得不借助遞歸。在SQL server 2005中,我們可以使用CTE,當(dāng)然,好的數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)可以避免你使用CTE,請(qǐng)看這里:http://www.cnblogs.com/downmoon/archive/2009/10/23/1588405.html。
如果你是一個(gè)數(shù)據(jù)庫(kù)設(shè)計(jì)新手,那么在sql server 2008中可以使用新的原生分層結(jié)構(gòu)數(shù)據(jù)hierarchyid。
關(guān)于它的詳細(xì)說(shuō)明,請(qǐng)看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
需要注意的是,它可以改造傳統(tǒng)數(shù)據(jù)表而成。但不可以實(shí)現(xiàn)與XML互相轉(zhuǎn)換。
下面我們看一個(gè)示例:
- if OBJECT_ID('[Category_hierarchyid]') is not null
- drop table [Category_hierarchyid]
- go
- --創(chuàng)建表
- 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/','根菜類(lèi)','蔬菜' union all
- select '/2/','葉菜類(lèi)','蔬菜' union all
- select '/3/','茄果類(lèi)','蔬菜' union all
- select '/4/','甘藍(lán)類(lèi)','蔬菜' union all
- select '/1/1/','蘿卜','蔬菜' union all
- select '/1/1/','胡蘿卜','蔬菜' union all
- select '/4/2/','甘藍(lán)','蔬菜' 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 中的原生分層數(shù)據(jù):hierarchyid
--查看所有的分類(lèi)
- SELECT * FROM [Category_hierarchyid]
- /*
- H_ID C_ID C_Name Title
- 0x 1000 蔬菜 蔬菜
- 0x58 1001 根菜類(lèi) 蔬菜
- 0x68 1002 葉菜類(lèi) 蔬菜
- 0x78 1003 茄果類(lèi) 蔬菜
- 0x84 1004 甘藍(lán)類(lèi) 蔬菜
- 0x5AC0 1005 蘿卜 蔬菜
- 0x5AC0 1006 胡蘿卜 蔬菜
- 0x85A0 1007 甘藍(lán) 蔬菜
- 0x6C20 1008 花椰菜 蔬菜
- 0x7BC0 1009 茄子 蔬菜
- 0x7BC0 1010 番茄 蔬菜
- 0x5AE3 1011 白蘿卜 蔬菜
- */
--查看所有的分類(lèi)及級(jí)別
- SELECT *,H_ID.GetLevel() AS Level FROM [Category_hierarchyid]
- /*
- H_ID C_ID C_Name Title Level
- 0x 1000 蔬菜 蔬菜 0
- 0x58 1001 根菜類(lèi) 蔬菜 1
- 0x68 1002 葉菜類(lèi) 蔬菜 1
- 0x78 1003 茄果類(lèi) 蔬菜 1
- 0x84 1004 甘藍(lán)類(lèi) 蔬菜 1
- 0x5AC0 1005 蘿卜 蔬菜 2
- 0x5AC0 1006 胡蘿卜 蔬菜 2
- 0x85A0 1007 甘藍(lán) 蔬菜 2
- 0x6C20 1008 花椰菜 蔬菜 2
- 0x7BC0 1009 茄子 蔬菜 2
- 0x7BC0 1010 番茄 蔬菜 2
- 0x5AE3 1011 白蘿卜 蔬菜 3
- */
--查看根菜類(lèi)及其子分類(lèi)
- 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 根菜類(lèi) 蔬菜 1
- 0x5AC0 1005 蘿卜 蔬菜 2
- 0x5AC0 1006 胡蘿卜 蔬菜 2
- 0x5AE3 1011 白蘿卜 蔬菜 3
- */
--查看胡蘿卜及其所有父分類(lèi)
- 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 根菜類(lèi) 蔬菜 1
- 0x5AC0 1005 蘿卜 蔬菜 2
- 0x5AC0 1006 胡蘿卜 蔬菜 2
- */
關(guān)于SQL Server 2008原生的分層數(shù)據(jù)類(lèi)型hierarchyid的知識(shí)就介紹到這里了,希望本次的介紹能夠?qū)δ兴斋@!
【編輯推薦】






