我想像这样插入hierarchyId
/
- 首席执行官(根)/1/
- 采购经理/1/1/
- 采购主管
/2/
- 销售经理/2/1/
- 销售主管
这就是我想要使用的层次结构,对吗?如果是,我该怎么做,谁能给我一些代码片段。
我想像这样插入hierarchyId
/
- 首席执行官(根)
/1/
- 采购经理
/1/1/
- 采购主管/2/
- 销售经理
/2/1/
- 销售主管这就是我想要使用的层次结构,对吗?如果是,我该怎么做,谁能给我一些代码片段。
我在搜索有关数据类型的信息时遇到了这个问题,并认为其他任何追随我的人也看到根据问题插入 s 的hierarchyid
代码会很有趣。hierarchyid
我并不是说这些是插入hierarchyid
s 的唯一方法,但希望它能帮助那些像我一样以前没有使用过这种数据类型经验的人。
使用这张表,
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
数据类型方法GetRoot和GetDescendant来构建层次结构。我发现这种方法更麻烦,但我认为如果您以编程方式管理层次结构,则必须使用这些方法。
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')
一定要查看其他答案中提供的链接,但希望尝试使用此代码也会有所帮助。
假设您有一个带有自联接的表模式(如下所示),并且您的 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 数据在添加后保持一致,则应采用非常具体的方式对其进行维护。