2010-12-14 4 views
8

내가이생성은

/같은 HIERARCHYID를 삽입 할 HIERARCHYID - CEO (루트)

/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) –

답변

17

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') 

다음과 같은 쿼리를 사용을

을 사용할 수도 있습니다.데이터 형식 메서드 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

+0

@adrift 첫 번째 INSERT 코드는 이전에 계층 경로를 알고 있으므로 현실 세계 시나리오에서는 유지 관리가 쉽지 않다고 가정합니다. 계층 적 메서드 (성가신 것으로 레이블을 붙인 메서드)를 사용해야합니다. –

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 열을 추가 할 그 다음 임시 테이블에 조인하여 채 웁니다. 당신이 추가 한 후 HIERARCHYID 데이터가 일관성을 유지하려는 경우

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

그러나, 명심, 그것은 유지되어야하는 매우 구체적인 방법이 있음.

+0

다음은 Id-ParentId 열이 이미있는 경우 Hid 생성에 대한 또 다른 예제입니다. https://www.codeproject.com/Articles/1192607/Combination-of-Id-ParentId-and-HierarchyId –