我想插入HIERARCHYID这样生成HIERARCHYID
/- 首席执行官(根)
/1/- 采购经理 /2/- 销售经理
/1/1/- 购买执行 /2/1/- 销售执行
这就是我想使用的层次结构,如果是这样,如果是这样,我怎么能做到这一点,任何人都可以给我一些代码片段。
我想插入HIERARCHYID这样生成HIERARCHYID
/- 首席执行官(根)
/1/- 采购经理 /2/- 销售经理
/1/1/- 购买执行 /2/1/- 销售执行
这就是我想使用的层次结构,如果是这样,如果是这样,我怎么能做到这一点,任何人都可以给我一些代码片段。
我在搜索关于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
数据类型方法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')
绝对检查在其他答案中提供的链接,但希望有此代码尝试也会有所帮助。
好的答案。感谢您保持简单。 – Phil 2012-05-06 19:18:39
@adrift您的第一个INSERT代码假设您事先知道层次结构路径,因此在现实世界中不可维护。您需要使用hierarchyid方法(您标记为繁琐的方法)。 – 2014-12-25 09:59:34
假设你有一个表模式自联接(如下图所示),并且你的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数据保持一致,也有它应保持非常具体的方式。
当你已经有Id-ParentId列的时候,下面是另一个Hid代的例子https://www.codeproject.com/Articles/1192607/Combination-of-Id-ParentId-and-HierarchyId – 2017-09-27 09:06:46
检查以下网址:使用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