2010-12-14 41 views
8

我想插入HIERARCHYID这样生成HIERARCHYID

/- 首席执行官(根)

/1/- 采购经理 /2/- 销售经理

/1/1/- 购买执行 /2/1/- 销售执行

这就是我想使用的层次结构,如果是这样,如果是这样,我怎么能做到这一点,任何人都可以给我一些代码片段。

+0

检查以下网址:使用hierarchyid数据类型(数据库引擎)(http://technet.microsoft.com/en-us/library/bb677173.aspx)[教程:使用hierarchyid数据类型(HTTP: //technet.microsoft.com/en-us/library/bb677213.aspx) – 2010-12-14 13:53:39

回答

17

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

我不认为这些是插入hierarchyid的唯一方法,但希望它能帮助那些和我一样没有使用此数据类型的经验的人。

使用此表,

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

可以使用Parse使用字符串路径直接将hierarchyid 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') 

绝对检查在其他答案中提供的链接,但希望有此代码尝试也会有所帮助。

+0

好的答案。感谢您保持简单。 – Phil 2012-05-06 19:18:39

+0

@adrift您的第一个INSERT代码假设您事先知道层次结构路径,因此在现实世界中不可维护。您需要使用hierarchyid方法(您标记为繁琐的方法)。 – 2014-12-25 09:59:34

0

假设你有一个表模式自联接(如下图所示),并且你的CEO的经理ID为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数据保持一致,也有它应保持非常具体的方式。

+0

当你已经有Id-ParentId列的时候,下面是另一个Hid代的例子https://www.codeproject.com/Articles/1192607/Combination-of-Id-ParentId-and-HierarchyId – 2017-09-27 09:06:46