zoukankan      html  css  js  c++  java
  • Hierarchyid 常用操作

     

     

    ---------内置函数------------

    select hierarchyid::GetRoot()--0x

    select hierarchyid::Parse('/1/1/') --0x5AC0

    select cast(0x5AC0 as hierarchyid)--0x5AC0

    select cast('/1/' as hierarchyid)--0x5AC0

    select cast(0x5AC0 as hierarchyid).ToString()--/1/1/

    select cast(0x5AC0 as hierarchyid).GetLevel()--2

     

    -----------IsDescendantOf------------ 判断@Node是否为@parent的子节点

    declare @Node hierarchyid

    declare @parent hierarchyid

    set @Node='/1/2/3/4/'

    set @parent='/1/2/'

     

    select @Node.IsDescendantOf(@parent)--1

    select @parent.IsDescendantOf(@Node)--0

     

    --------GetAncestor ( n ) ----------返回指定层次的祖先.

    declare @hy hierarchyid

    declare @c int

    set @hy='/1/1/2/1/'

    set @c=@hy.GetLevel()

    select @hy.GetAncestor(0).ToString()--/1/1/2/1/

    select @hy.GetAncestor(1).ToString()--/1/1/2/

    select @hy.GetAncestor(@c).ToString()--/

    select @hy.GetAncestor(@c+1).ToString()--null

     

     

     

    -----------GetDescendant-----------返回子集

    //1.如果父级为NULL,则返回NULL。

     

    ---如果父级不为NULL----

    --2.而child1 和child2 为NULL,则返回父级的子级。--

    declare @hy hierarchyid

    set @hy='/1/1/'

    select @hy.GetDescendant(NULL,NULL).ToString()--/1/1/1/

     

    --3. 返回值 在child1于child2之间 , child1>child2 且必须为@hy的子集--

    select @hy.GetDescendant('/1/1/5/',null).ToString()--/1/1/6/

    select @hy.GetDescendant(null,'/1/1/5/').ToString()--/1/1/4/

    select @hy.GetDescendant('/1/1/2/','/1/1/5/').ToString()--/1/1/3/

    select @hy.GetDescendant('/1/1/3/','/1/1/4/').ToString()--/1/1/3.1/

    select @hy.GetDescendant(null,'/1/1/1/5/').ToString()--报异常

    select @hy.GetDescendant('/1/1/5/','/1/1/3/').ToString()--报异常

     

    ---------◆GetReparentedValue :可以用来移动节点 --------------

    注意:@parent是Node的祖先

     

    declare @Node hierarchyid

    DECLARE @NodeChild1 hierarchyid

    declare @parent hierarchyid, @new hierarchyid

    set @Node='/1/2/3/4/'

    set @NodeChild1='/1/2/3/4/5/'

    set @parent='/1/2/'

    set @new='/5/6/7/'

     

    SET @Node=@Node.GetReparentedValue(@parent, @new)

    select @Node.ToString()--/5/6/7/3/4/

    SELECT @NodeChild1.GetReparentedValue(hierarchyid::Parse('/1/2/3/4/'), @Node).ToString()

     

     

    移动子树

    另一项常用操作是移动子树。下面的过程采用 @oldMgr 的子树作为参数,使其(包括 @oldMgr)成为 @newMgr 的子树。

    CREATE PROCEDURE MoveOrg(@oldMgr nvarchar(256), @newMgr nvarchar(256) )

    AS

    BEGIN

    DECLARE @nold hierarchyid, @nnew hierarchyid

    SELECT @nold = OrgNode FROM HumanResources.EmployeeDemo WHERE LoginID = @oldMgr ;

     

    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

    BEGIN TRANSACTION

    SELECT @nnew = OrgNode FROM HumanResources.EmployeeDemo WHERE LoginID = @newMgr ;

     

    SELECT @nnew = @nnew.GetDescendant(max(OrgNode), NULL)

    FROM HumanResources.EmployeeDemo WHERE OrgNode.GetAncestor(1)=@nnew ;

     

    UPDATE HumanResources.EmployeeDemo

    SET OrgNode = OrgNode.GetReparentedValue(@nold, @nnew)

    WHERE OrgNode.IsDescendantOf(@nold) = 1 ;

     

    COMMIT TRANSACTION

    END ;

    GO

     

     

     

    参考:

     

    http://technet.microsoft.com/zh-cn/library/bb677212(v=sql.105).aspx

    http://blog.csdn.net/tjvictor/article/details/4395681

    http://msdn.microsoft.com/zh-cn/library/bb677290(v=sql.105).aspx

     

     

     

        

  • 相关阅读:
    [linux] 使用markdown写文档
    [c/c++] C数据结构: 链表 Linked List
    Apache 2 : starting apache
    GNU/CPIO 学习小结
    lsof 命令小结
    在Linux中扩展磁盘容量(1)
    在linux中扩展磁盘容量(2)LVM
    RHEL6.0 QEMU/KVM 建立新的虚拟机之配置Birdged Networking
    NFS server down机或重启导致的NFS系统错误
    Build linux kernel Module
  • 原文地址:https://www.cnblogs.com/QinQouShui/p/4007093.html
Copyright © 2011-2022 走看看