내가이생성은
/같은 HIERARCHYID를 삽입 할 HIERARCHYID - CEO (루트)
/1/- 구매 관리자 /2/- 영업 관리자
/1/1/- 구입 임원 /2/1/- 영업 담당
이것은 내가 사용하고 싶은 계층 구조입니다. 그렇다면 어떻게하면 좋을까요? 어떤 사람이 나에게 몇 가지 코드 스 니펫을 줄 수 있습니까?
내가이생성은
/같은 HIERARCHYID를 삽입 할 HIERARCHYID - CEO (루트)
/1/- 구매 관리자 /2/- 영업 관리자
/1/1/- 구입 임원 /2/1/- 영업 담당
이것은 내가 사용하고 싶은 계층 구조입니다. 그렇다면 어떻게하면 좋을까요? 어떤 사람이 나에게 몇 가지 코드 스 니펫을 줄 수 있습니까?
hierarchyid
데이터 유형에 대한 정보를 검색하는 동안이 질문이 나타나서 질문에 따라 hierarchyid
을 삽입하는 코드를보기 위해 다른 사람이 나에게 흥미로울 것이라고 생각했습니다.
나는 이것이 hierarchyid
을 삽입하는 유일한 방법이라고 주장하지는 않지만, 저처럼이 데이터 유형으로 작업 한 경험이없는 사람들에게 도움이되기를 바랍니다. 이 테이블을 사용
,
create table OrgChart
(
Position hierarchyid,
Title nvarchar(50)
)
직접 문자열 경로를 사용하여 hierarchyid
의를 삽입 Parse를 사용할 수 있습니다 테이블
select Position.ToString(), * from OrgChart
을 확인
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')
다음과 같은 쿼리를 사용을
을 사용할 수도 있습니다.데이터 형식 메서드 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
@adrift 첫 번째 INSERT 코드는 이전에 계층 경로를 알고 있으므로 현실 세계 시나리오에서는 유지 관리가 쉽지 않다고 가정합니다. 계층 적 메서드 (성가신 것으로 레이블을 붙인 메서드)를 사용해야합니다. –
자체 조인 (아래 그림 참조)이있는 테이블 스키마가 있고 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 열을 추가 할 그 다음 임시 테이블에 조인하여 채 웁니다. 당신이 추가 한 후 HIERARCHYID 데이터가 일관성을 유지하려는 경우
UPDATE Employee
SET EmployeeHierarchyID = #EmployeeHierarchy.EmployeeHierarchyID
FROM Employee INNER JOIN
#EmployeeHierachy ON Employee.EmployeeID = #EmployeeHierarchy.EmployeeID
그러나, 명심, 그것은 유지되어야하는 매우 구체적인 방법이 있음.
다음은 Id-ParentId 열이 이미있는 경우 Hid 생성에 대한 또 다른 예제입니다. https://www.codeproject.com/Articles/1192607/Combination-of-Id-ParentId-and-HierarchyId –
[hierarchyid 데이터 형식 (데이터베이스 엔진) 사용] (http://technet.microsoft.com/en-us/library/bb677173.aspx) [자습서 : hierarchyid 데이터 형식 사용] (http : //technet.microsoft.com/en-us/library/bb677213.aspx) –