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

    http://entityframework.codeplex.com/discussions/415185

    http://stackoverflow.com/questions/25195890/need-examples-for-entityframework-hierarchyid

    http://blog.csdn.net/tonyzhou2008/article/details/5100683

    http://www.tuicool.com/articles/iEnum2f

    http://blog.csdn.net/szstephenzhou/article/details/8277667

    http://blog.csdn.net/ldslove/article/details/5628007

  • 相关阅读:
    Xshell如何配置并远程连接Linux服务器详解
    VMware如何克隆一个虚拟机
    如何通过VMware安装Linux CentOS 7.7系统
    如何VMware创建Linux虚拟机并设置虚拟机网络
    自动化运维工具Ansible之LNMP实践环境部署
    自动化运维工具Ansible之Roles角色详解
    自动化运维工具Ansible之Tests测验详解
    Ansible Jinja2 模板使用
    Ansible playbook Vault 加密
    Ansible playbook 编程
  • 原文地址:https://www.cnblogs.com/zcm123/p/5053314.html
Copyright © 2011-2022 走看看