SQL Server 2008中SQL应用系列--目录索引

如果是在SQL 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://msdn.microsoft.com/zh-cn/library/bb677173.aspx

http://msdn.microsoft.com/en-us/magazine/cc794278.aspx#id0090037

需要注意的是,它可以改造传统数据表而成。但不可以实现与XML互相转换。

下面我们看一个示例:

ifOBJECT_ID('[Category_hierarchyid]') isnotnull
droptable[Category_hierarchyid]
go

--创建表
CREATETABLE[Category_hierarchyid]
(
H_ID hierarchyid NOTNULL,
C_ID INTprimarykeyidentity(1000,1) NOTNULL,
C_Name NVARCHAR(50) NOTNULL,
Title NVARCHAR(50) NOTNULL
)
GO

TRUNCATEtable[Category_hierarchyid]
GO
INSERTINTO[Category_hierarchyid]([H_ID],[C_Name],[Title])
select'/','蔬菜','蔬菜'unionall
select'/1/','根菜类','蔬菜'unionall
select'/2/','叶菜类','蔬菜'unionall
select'/3/','茄果类','蔬菜'unionall
select'/4/','甘蓝类','蔬菜'unionall
select'/1/1/','萝卜','蔬菜'unionall
select'/1/1/','胡萝卜','蔬菜'unionall
select'/4/2/','甘蓝','蔬菜'unionall
select'/2/4/','花椰菜','蔬菜'unionall
select'/3/3/','茄子','蔬菜'unionall
select'/3/3/','番茄','蔬菜'unionALL
select'/1/1/5/','白萝卜','蔬菜'

go

/***********SQL server 2008 中的原生分层数据:hierarchyid 3w@live.cn*****************************/
--查看所有的分类
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() ASLevelFROM[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() ASLevelFROM[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()ASLevelFROM[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
*/

相关资源:

1、SQL2005/2008中的CTE应用--递归查询

http://www.cnblogs.com/downmoon/archive/2009/10/23/1588405.html

2、gridview中分组数据的显示

http://www.cnblogs.com/downmoon/archive/2008/08/26/1276538.html

3、DataRelation(DataSet中父子表)的一个示例

http://www.cnblogs.com/downmoon/archive/2009/12/27/1633302.html

SQL Server 2008中原生的分层数据类型:hierarchyid相关推荐

  1. SQL Server 2008中SQL应用系列及BI学习笔记系列--目录索引 @邀月

    邀月 的数据库学习 http://www.cnblogs.com/downmoon/archive/2011/03/10/1980172.html SQL Server 2008中SQL应用系列及BI ...

  2. 使用一下SQL Server 2008中的新日期函数

    在我们开始讨论SQL Server 2008中新的日期数据类型之前,先来回顾一下SQL Server 2005中以及更老版本中提供的两种日期数据类型,这些旧的数据类型是DATETIME和SMALLDA ...

  3. SQL SERVER 2008中使用VARBINARY(MAX)进行二进制数据存取的实现方法

    在数据库应用项目开发中,经常会使用一些二进制的图像数据,存储和读取显示图像数据主要采用的是路径链接法和内存流法.路径链接法是将图像文件保存在固定的路径下,数据库中只存储图像文件的路径和名称,此方法数据 ...

  4. SQL Server 2008中的Pivot和UnPivot

    SQL Server 2008中SQL应用系列--目录索引 今天给新成员讲解PIVOT 和 UNPIVOT示例,顺便整理了一下其用法.这是自SQL Server 2005起提供的新功能. 官方示例:h ...

  5. SQL Server 2008中Analysis Services的新特性——深入SQL Server 2008

    SQL Server 2008中Analysis Services的新特性 --深入SQL Server 2008 内容简介: 本书涵盖了SQL Server 2008引入的新功能.作者之一Rober ...

  6. SQL Server 2008中SQL增强之三:Merge(在一条语句中使用Insert,Update,Delete)

    SQL Server 2008中SQL增强之三:Merge(在一条语句中使用Insert,Update,Delete) SQL Server 2008提供了一个增强的SQL命令Merge,用法参看MS ...

  7. mysql中的merge into,SQL Server 2008中利用merge into关键实现insert/update自动匹配(类似于MySQL中的For Update关键字)...

    SQL Server 2008中利用merge into关键实现insert/update自动匹配(类似于MySQL中的For Update关键字) 语法请参考: 按照语法编写语句 DECLARE @ ...

  8. 在SQL Server 2008中调用.net,dll

    T-SQL的在执行普通的查询的时候是很高效的,但是在执行循环,判断这样的语句的时候效率就不那么的高了.这时可以借助CLR了,我们可以在SQL Server 2008中扩展C#程序来完成循环等过程式的查 ...

  9. SQL Server 2008中的代码安全(四):主密钥

    SQL Server 2008中SQL应用系列--目录索引 在SQL Server中的加密由层次结构形式进行处理以提供多级别的安全.SQL Server包含两个用于加密数据的密钥类型.如下图: 1.服 ...

最新文章

  1. 机器学习数据预处理之缺失值:插值法填充+ lagrange插值+拉格朗日插值
  2. 射频全网通笔记(附全球频段划分及主要运营商对应表)
  3. 中石油训练赛 - 手机号码(简单分块+思维)
  4. product category no need to optimize
  5. 使用vh来制作高度自适应页面和元素垂直居中
  6. 深入理解Flask中的上下文
  7. Practical Go: Real world advice for writing maintainable Go programs
  8. vue中v-model和v-bind区别
  9. [转] Windows完成端口与Linux epoll技术简介
  10. Mysql数据库和表的操作
  11. 联通计算机用户名和密码,终极:联通路由器的默认登录密码是什么?
  12. 关于我写公众号的目的和原因
  13. PHP+MySQL实现博客管理系统
  14. 计算机博士论文 评阅意见,博士论文评阅意见
  15. 电脑显示erc服务器不用,实操讲解:如何装饰你的ERC721非同质化资产?
  16. mDNS实现之Bonjour与Avahi(一)——win/linux/arm交叉编译
  17. html 特殊字符 三角形,特殊字符
  18. 非上海户籍人员在上海买房需要啥条件?
  19. 计算机毕业设计不会做?
  20. 嘿嘿,几行代码秒出美女素描图

热门文章

  1. pacs定位线_PACS中MR序列定位线的绘制
  2. 仓储rfid文件_RFID智能仓储管理技术浅析之RFID电子标签的使用
  3. Xamarin iOS开发实战(内部资料)
  4. 计算机应用基础形考报告2020,放大学计算机应用基础形考本学习报告
  5. 改编码格式_编码不规范,同事真的会两行泪?
  6. 2个点马氏距离计算实例_数据分析基础:距离度量方式(欧式距离、马氏距离、曼哈顿距离)...
  7. 有了“手掌”,机械手也能盘“核桃”,耶鲁出品 | Science子刊
  8. GitLab成立中国合资公司极狐,强调“独立运营”
  9. MIT的这个AI,专治抗生素滥用,二次抗生素直降67%
  10. arXiv灌水机:机器自动生成论文标题、摘要信息,还有40+奇妙AI应用