9

我想像这样插入hierarchyId

  • / - 首席执行官(根)
    • /1/- 采购经理
      • /1/1/- 采购主管
    • /2/- 销售经理
      • /2/1/- 销售主管

这就是我想要使用的层次结构,对吗?如果是,我该怎么做,谁能给我一些代码片段。

4

2 回答 2

18

我在搜索有关数据类型的信息时遇到了这个问题,并认为其他任何追随我的人也看到根据问题插入 s 的hierarchyid代码会很有趣。hierarchyid

我并不是说这些是插入hierarchyids 的唯一方法,但希望它能帮助那些像我一样以前没有使用过这种数据类型经验的人。

使用这张表,

create table OrgChart
(
    Position hierarchyid,
    Title nvarchar(50)
)

您可以使用Parsehierarchyid使用字符串路径直接插入s:

insert into OrgChart(Position, Title) 
    values  (hierarchyid::Parse('/'), 'CEO'),
            (hierarchyid::Parse('/1/'), 'Purchase Manager'),
            (hierarchyid::Parse('/1/1/'), 'Purchase Executive'),
            (hierarchyid::Parse('/2/'), 'Sales Manager'),
            (hierarchyid::Parse('/2/1/'), 'Sales Executive')

并使用以下查询检查表

select Position.ToString(), * from OrgChart

您还可以使用hierarchyid数据类型方法GetRootGetDescendant来构建层次结构。我发现这种方法更麻烦,但我认为如果您以编程方式管理层次结构,则必须使用这些方法。

declare @root hierarchyid,
        @id hierarchyid

set @root = hierarchyid::GetRoot()

insert into OrgChart(Position, Title) values (@root, 'CEO')

set @id = @root.GetDescendant(null, null)
insert into OrgChart(Position, Title) values (@id, 'Purchase Manager')

set @id = @root.GetDescendant(@id, null)
insert into OrgChart(Position, Title) values (@id, 'Sales Manager')

select @id = Position.GetDescendant(null, null) from OrgChart where Title = 'Purchase Manager'    
insert into OrgChart(Position, Title) values (@id, 'Purchase Executive')

select @id = Position.GetDescendant(null, null) from OrgChart where Title = 'Sales Manager'    
insert into OrgChart(Position, Title) values (@id, 'Sales Executive')

一定要查看其他答案中提供的链接,但希望尝试使用此代码也会有所帮助。

于 2011-09-15T02:31:46.977 回答
0

假设您有一个带有自联接的表模式(如下所示),并且您的 CEO 的 ManagerID 为 NULL。

CREATE TABLE Employees
(
    EmployeeID int NOT NULL IDENTITY(1,1) PRIMARY KEY
    , JobTitle nvarchar(50) NOT NULL
    , FirstName nvarchar(50) NOT NULL
    , LastName nvarchar(50)
    , ManagerID int
) 

ALTER TABLE dbo.Employee ADD CONSTRAINT FK_Employee_ManagingEmployee FOREIGN KEY (MangerID) REFERENCES dbo.Employee (EmployeeID) ON

UPDATE NO ACTION
    ON

DELETE NO ACTION

您可以使用以下递归 CTE 自动生成一组初始的 hierarchyid 值:

;WITH EmployeeHierarchy (
    EmployeeHierarchyID
    , EmployeeID
    , JobTitle
    , LastName
    , FirstName
    , ManagerID
    )
AS (
    SELECT HIERARCHYID::GetRoot() AS EmployeeHierarchyID
        , EmployeeID
        , JobTitle
        , LastName
        , FirstName
        , ManagerID
    FROM Employee
    WHERE ManagerID IS NULL

    UNION ALL

    SELECT HIERARCHYID::Parse(EmployeeHierarchyID.ToString() + (
                CONVERT(VARCHAR(20), ROW_NUMBER() OVER (
                        ORDER BY EmployeeHierarchy.EmployeeID
                        ))
                ) + '/') AS EmployeeHierarchy
        , EmployeeHierarchy.EmployeeID
        , EmployeeHierarchy.JobTitle
        , EmployeeHierarchy.LastName
        , EmployeeHierarchy.FirstName
        , EmployeeHierarchy.ManagerID
    FROM Employee
    INNER JOIN EmployeeHierarchy AS d
        ON Employee.ManagerID = d.EmployeeID
    )
SELECT TOP (100) PERCENT EmployeeHierarchyID
    , EmployeeID
    , JobTitle
    , LastName
    , FirstName
    , ManagerID
INTO #EmployeeHierarchy
FROM EmployeeHierarchy
ORDER BY EmployeeHierarchyID

然后向表中添加一个hierarchyid 列,在其上添加一个索引,然后通过连接到临时表来填充它就变成了一件相当简单的事情。

UPDATE Employee
SET          EmployeeHierarchyID = #EmployeeHierarchy.EmployeeHierarchyID
FROM     Employee INNER JOIN
                  #EmployeeHierachy ON Employee.EmployeeID = #EmployeeHierarchy.EmployeeID

但是,请记住,如果您希望 hierarchyid 数据在添加后保持一致,则应采用非常具体的方式对其进行维护。

于 2017-09-15T17:31:33.337 回答