日期:2014-05-17  浏览次数:20511 次

SQL SERVER 2008 新数据库类型hierarchyid
/*

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

    

&nb