• Hierarchyid(层次结构)数据类型


    实例表结构

    CREATE TABLE [dbo].[Emp](
        [ID] [int] IDENTITY(1,1),
        [Name] [varchar](50),
        [Org] [hierarchyid],
    )
    
    INSERT INTO Emp(Name,Org) VALUES('吴xx','/')
    INSERT INTO Emp(Name,Org) VALUES('谢xx','/1/')
    INSERT INTO Emp(Name,Org) VALUES('赵xx','/2/')
    INSERT INTO Emp(Name,Org) VALUES('卢xx','/1/1/')
    INSERT INTO Emp(Name,Org) VALUES('方xx','/1/2/')
    INSERT INTO Emp(Name,Org) VALUES('詹xx','/1/3/')
    INSERT INTO Emp(Name,Org) VALUES('沈xx','/2/1/')

    实例基础数据

    SELECT *,Org.ToString(),Org.GetLevel()
    FROM Emp

      

    hierarchyid方法

    ToString:节点路径

    --node.ToString()
    SELECT *,Org.ToString()
    FROM Emp

    GetLevel:节点深度

    --node.GetLevel()
    SELECT *,Org.GetLevel()
    FROM Emp
    
    SELECT *,Org.GetLevel()
    FROM Emp
    WHERE Org.GetLevel() = 1

     

    GetAncestor:节点N级祖先,即通过祖先节点反向获取指定级别的子节点。

    --child.GetAncestor(n)
    --指定节点的二级子节点
    SELECT @CurrentNode = Org FROM Emp WHERE Name = '吴xx'
    SELECT * FROM Emp WHERE Org.GetAncestor(2) = @CurrentNode

    GetDescendant:节点子节点,大于child1且小于child2,child1/child2可为NULL。

    --parent.GetDescendant(child1,child2)
    --新增吴子节点,与谢/赵同级,但大于谢且小于赵。
    DECLARE @Child1 hierarchyid
    DECLARE @Child2 hierarchyid
    SELECT @CurrentNode = Org FROM Emp WHERE Name = '吴xx'
    SELECT @Child1 = Org FROM Emp WHERE Name = '谢xx'
    SELECT @Child2 = Org FROM Emp WHERE Name = '赵xx'
    INSERT INTO Emp(Name,Org) VALUES('于xx',@CurrentNode.GetDescendant(@Child1,@Child2))

    IsDescendantOf:是否是节点的后代节点

    --child.IsDescendantOf(parent)
    --指定节点下的全部后代节点,包含本身
    SELECT @CurrentNode = Org FROM Emp WHERE Name = '吴xx'
    SELECT * FROM Emp WHERE Org.IsDescendantOf(@CurrentNode) = 1

    GetReparentedValue:节点移动,节点路径从oldRoot指向newRoot

    --node.GetReparentedValue(oldRoot,newRoot)
    --于从指向吴子节点,更新指向赵子节点。
    DECLARE @OldRoot hierarchyid
    DECLARE @NewRoot hierarchyid
    SELECT @CurrentNode = Org FROM Emp WHERE Name = '于xx'
    SELECT @OldRoot = Org FROM Emp WHERE Name = '吴xx'
    SELECT @NewRoot = Org FROM Emp WHERE Name = '赵xx'
    UPDATE Emp SET Org=@CurrentNode.GetReparentedValue(@OldRoot,@NewRoot) WHERE Org = @CurrentNode

    GetRoot:根节点

    --hierarchyid::GetRoot()
    SELECT *
    FROM Emp
    WHERE Org = hierarchyid::GetRoot()

    Parse:从路径字符串转换为hierarchyid值,即编码。

    --hierarchyid::Parse()
    DECLARE @StringNode varchar(50)
    SET @StringNode = '/1/1/'
    SELECT *,Org.ToString() FROM Emp WHERE Org = hierarchyid::Parse(@StringNode)

     

  • 相关阅读:
    沟通是项目管理知识体系中的九大知识领域之一
    项目管理的三要素时间、成本、质量
    项目管理提升效率的几大关键点
    收到FRDMKL02Z
    【转】arm 开发工具比较(ADS vs RealviewMDK vs RVDS)
    你不能自己把自己放弃写在毕业季
    【转】为什么你应该(从现在开始就)写博客
    Vivado 2014.4 FFT IP 使用及仿真
    项目需求的一些事
    娇荣电子工作室成立了
  • 原文地址:https://www.cnblogs.com/zenple/p/4790058.html
Copyright © 2020-2023  润新知