博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL SERVER 2008 新数据库类型hierarchyid
阅读量:5994 次
发布时间:2019-06-20

本文共 1948 字,大约阅读时间需要 6 分钟。

-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十六进制值.

   

    使用斜杠字符来表示层次路径,一个表示的是根,用斜杠分隔的整数值来组成连续的层次.

   

   

    插入小弟

*/

    INSERT TEST([PHASE],USERID,USERNAME)

    VALUES('/1/',1002,'土豆')

   

    INSERT TEST([PHASE],USERID,USERNAME)

    VALUES('/2/',1003,'红太狼')

    --以上条数据时同级别的

   

   

    SELECT * FROM TEST

/*

    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/')

   

    INSERT TEST([PHASE],USERID,USERNAME)

    VALUES(@PARENTPHASE.GetDescendant(NULL,NULL),1004,'土豆小弟1')

   

    SELECT @Child1 = CAST('/1/1/' AS hierarchyid)

    INSERT TEST([PHASE],USERID,USERNAME)

    VALUES(@PARENTPHASE.GetDescendant(@Child1,NULL),1005,'土豆小弟2')

   

    SELECT [PHASE].ToString() AS [PHASE] ,LVL,USERID,USERNAME FROM TEST

    ORDER BY [PHASE]

   

/*

转载地址:http://dhxlx.baihongyu.com/

你可能感兴趣的文章
PHP开发0-PHP语言简介
查看>>
从学习c++到Java----编程启示录
查看>>
使用EasyRecovery恢复RAW格式的U盘数据
查看>>
资源收藏
查看>>
晨读打卡(2018.2)
查看>>
shell 信号列表
查看>>
深入浅出之正则表达式(一)
查看>>
数据库知识笔记
查看>>
企业级备份方案系列PART1:SCDPM 2012安装和配置
查看>>
小蚂蚁学习Redis笔记(1)——Redis简介、适用场景、对比
查看>>
我的友情链接
查看>>
ESXI支持linux远程命令管理
查看>>
linux内核动态加载模块
查看>>
ASP.NET MVC 5 - 验证编辑方法(Edit method)和编辑视图(Edit view)
查看>>
java垃圾回收算法之-标记清除
查看>>
压缩工具及bash脚本编程
查看>>
学习SpringMVC——你们要的REST风格的CRUD来了
查看>>
在EditPlus中使用代码格式化插件
查看>>
MYSQL主从复制部署流程
查看>>
Java中的增强 for 循环 foreach
查看>>