2-2단원 - 계층적 메서드를 사용하여 계층적 테이블 채우기Lesson 2-2 - Populating a Hierarchical Table Using Hierarchical Methods

이 항목은 다음에 적용됩니다.예SQL Server(2012부터)아니요Azure SQL Database아니요Azure SQL Data Warehouse 아니요병렬 데이터 웨어하우스 THIS TOPIC APPLIES TO: yesSQL Server (starting with 2012)noAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse AdventureWorks2012AdventureWorks2012의 마케팅 부서에는 8명의 직원이 근무하고 있습니다. AdventureWorks2012AdventureWorks2012 has 8 employees working in the Marketing department. 직원 계층은 다음과 같습니다.The employee hierarchy looks like this:

EmployeeID가 6인 David 는 Marketing Manager입니다.David, EmployeeID 6, is the Marketing Manager. 다음과 같은 3명의 Marketing Specialist가 David에게 보고합니다.Three Marketing Specialists report to David:

  • Sariya, EmployeeID 46Sariya, EmployeeID 46

  • John, EmployeeID 271John, EmployeeID 271

  • Jill, EmployeeID 119Jill, EmployeeID 119

Marketing Assistant인 Wanida (EmployeeID 269)는 Sariya에게 보고하고 다른 Marketing Assistant인 Mary (EmployeeID 272)는 John에게 보고합니다.Marketing Assistant Wanida (EmployeeID 269), reports to Sariya, and Marketing Assistant Mary (EmployeeID 272), reports to John.

계층 트리의 루트를 삽입하려면To insert the root of the hierarchy tree

  1. 다음 예에서는 Marketing Manager David 를 계층의 루트에 있는 테이블에 삽입합니다.The following example inserts David the Marketing Manager into the table at the root of the hierarchy. OrdLevel 열은 계산 열입니다.The OrdLevel column is a computed column. 따라서 INSERT 문의 일부가 아닙니다.Therefore, it is not part of the INSERT statement. 이 첫 번째 레코드는 GetRoot() 메서드를 사용하여 이 첫 번째 레코드를 계층의 루트로 채웁니다.This first record uses the GetRoot() method to populate this first record as the root of the hierarchy.

    INSERT HumanResources.EmployeeOrg (OrgNode, EmployeeID, EmpName, Title)  
    VALUES (hierarchyid::GetRoot(), 6, 'David', 'Marketing Manager') ;  
    GO  
    
  2. 다음 코드를 실행하여 테이블의 초기 행을 검사합니다.Execute the following code to examine initial row in the table:

    SELECT OrgNode.ToString() AS Text_OrgNode,   
    OrgNode, OrgLevel, EmployeeID, EmpName, Title   
    FROM HumanResources.EmployeeOrg ;  
    

    결과 집합은 다음과 같습니다.Here is the result set.

    Text_OrgNode OrgNode OrgLevel EmployeeID EmpName Title  
    ------------ ------- -------- ---------- ------- -----------------  
    /            Ox      0        6          David   Marketing Manager  
    

이전 단원에서와 같이 ToString() 메서드를 사용하여 hierarchyid 데이터 형식을 보다 이해하기 쉬운 형식으로 변환합니다.As in the previous lesson, we use the ToString() method to convert the hierarchyid data type to a format that is more easily understood.

부하 직원을 삽입하려면To insert a subordinate employee

  1. SariyaDavid에게 보고합니다.Sariya reports to David. Sariya 의 노드를 삽입하려면 hierarchyid 데이터 형식의 적절한 OrgNode값을 만들어야 합니다.To insert Sariya's node, you must create an appropriate OrgNode value of data type hierarchyid. 다음 코드에서는 hierarchyid 데이터 형식의 변수를 만들고 이를 테이블의 루트 OrgNode 값으로 채웁니다.The following code creates a variable of data type hierarchyid and populates it with the root OrgNode value of the table. 그런 다음 해당 변수를 GetDescendant() 메서드와 함께 사용하여 하위 노드인 행을 삽입합니다.Then uses that variable with the GetDescendant() method to insert row that is a subordinate node. GetDescendant 는 두 개의 인수를 사용합니다.GetDescendant takes two arguments. 인수 값에 대해 다음 옵션을 검토합니다.Review the following options for the argument values:

    • 부모가 NULL인 경우 GetDescendant 는 NULL을 반환합니다.If parent is NULL, GetDescendant returns NULL.

    • 부모가 NULL이 아니고 자식1과 자식2가 모두 NULL인 경우 GetDescendant 는 부모의 자식을 반환합니다.If parent is not NULL, and both child1 and child2 are NULL, GetDescendant returns a child of parent.

    • 부모와 자식1이 NULL이 아니고 자식2가 NULL인 경우 GetDescendant 는 자식1보다 큰 부모의 자식을 반환합니다.If parent and child1 are not NULL, and child2 is NULL, GetDescendant returns a child of parent greater than child1.

    • 부모와 자식2가 NULL이 아니고 자식1이 NULL인 경우 GetDescendant 는 자식2보다 작은 부모의 자식을 반환합니다.If parent and child2 are not NULL and child1 is NULL, GetDescendant returns a child of parent less than child2.

    • 부모, 자식1 및 자식2가 모두 NULL이 아닌 경우 GetDescendant 는 자식1보다 크고 자식2보다 작은 부모의 자식을 반환합니다.If parent, child1, and child2 are all not NULL, GetDescendant returns a child of parent greater than child1 and less than child2.

    다음 코드에서는 테이블에 루트를 제외한 행이 아직 없기 때문에 루트 부모의 (NULL, NULL) 인수를 사용합니다.The following code uses the (NULL, NULL) arguments of the root parent because there are not yet any rows in the table except the root. 다음 코드를 실행하여 Sariya를 삽입합니다.Execute the following code to insert Sariya:

    DECLARE @Manager hierarchyid   
    SELECT @Manager = hierarchyid::GetRoot()  
    FROM HumanResources.EmployeeOrg ;  
    
    INSERT HumanResources.EmployeeOrg (OrgNode, EmployeeID, EmpName, Title)  
    VALUES  
    (@Manager.GetDescendant(NULL, NULL), 46, 'Sariya', 'Marketing Specialist') ;  
    
  2. 첫 번째 프로시저의 쿼리를 반복하여 테이블을 쿼리하고 항목이 나타나는 방식을 확인합니다.Repeat the query from the first procedure to query the table and see how the entries appear:

    SELECT OrgNode.ToString() AS Text_OrgNode,   
    OrgNode, OrgLevel, EmployeeID, EmpName, Title   
    FROM HumanResources.EmployeeOrg ;  
    

    결과 집합은 다음과 같습니다.Here is the result set.

    Text_OrgNode OrgNode OrgLevel EmployeeID EmpName Title  
    ------------ ------- -------- ---------- ------- -----------------  
    /            Ox      0        6          David   Marketing Manager  
    /1/          0x58    1        46         Sariya  Marketing Specialist  
    

새 노드를 입력하는 프로시저를 만들려면To create a procedure for entering new nodes

  1. 데이터 입력을 단순화하기 위해 다음 저장 프로시저를 만들어 직원을 EmployeeOrg 테이블에 추가합니다.To simplify entering data, create the following stored procedure to add employees to the EmployeeOrg table. 이 프로시저는 추가하는 직원에 대한 입력 값을 받아들입니다.The procedure accepts input values about the employee being added. 여기에는 새 직원의 관리자에게 지정된 EmployeeID , 새 직원의 EmployeeID 번호 및 해당 직원의 이름과 직책이 포함됩니다.This includes the EmployeeID of the new employee's manager, the new employee's EmployeeID number, and their first name and title. 이 프로시저는 GetDescendant()GetAncestor() 메서드를 사용합니다.The procedure uses GetDescendant() and also the GetAncestor() method. 다음 코드를 실행하여 프로시저를 만듭니다.Execute the following code to create the procedure:

    CREATE PROC AddEmp(@mgrid int, @empid int, @e_name varchar(20), @title varchar(20))   
    AS   
    BEGIN  
       DECLARE @mOrgNode hierarchyid, @lc hierarchyid  
       SELECT @mOrgNode = OrgNode   
       FROM HumanResources.EmployeeOrg   
       WHERE EmployeeID = @mgrid  
       SET TRANSACTION ISOLATION LEVEL SERIALIZABLE  
       BEGIN TRANSACTION  
          SELECT @lc = max(OrgNode)   
          FROM HumanResources.EmployeeOrg   
          WHERE OrgNode.GetAncestor(1) =@mOrgNode ;  
    
          INSERT HumanResources.EmployeeOrg (OrgNode, EmployeeID, EmpName, Title)  
          VALUES(@mOrgNode.GetDescendant(@lc, NULL), @empid, @e_name, @title)  
       COMMIT  
    END ;  
    GO  
    
  2. 다음 예에서는 David에게 직접 또는 간접적으로 보고하는 나머지 직원 4명을 추가합니다.The following example adds the remaining 4 employees that report directly or indirectly to David.

    EXEC AddEmp 6, 271, 'John', 'Marketing Specialist' ;  
    EXEC AddEmp 6, 119, 'Jill', 'Marketing Specialist' ;  
    EXEC AddEmp 46, 269, 'Wanida', 'Marketing Assistant' ;  
    EXEC AddEmp 271, 272, 'Mary', 'Marketing Assistant' ;  
    
  3. 다시 다음 쿼리를 실행하여 EmployeeOrg 테이블의 행을 검사합니다.Again, execute the following query examine the rows in the EmployeeOrg table:

    SELECT OrgNode.ToString() AS Text_OrgNode,   
    OrgNode, OrgLevel, EmployeeID, EmpName, Title   
    FROM HumanResources.EmployeeOrg ;  
    GO  
    

    결과 집합은 다음과 같습니다.Here is the result set.

    Text_OrgNode OrgNode OrgLevel EmployeeID EmpName Title  
    ------------ ------- -------- ---------- ------- -----------------  
    /            Ox      0        6          David   Marketing Manager  
    /1/          0x58    1        46         Sariya  Marketing Specialist  
    /1/1/        0x5AC0  2        269        Wanida  Marketing Assistant  
    /2/          0x68    1        271        John    Marketing Specialist  
    /2/1/        0x6AC0  2        272        Mary    Marketing Assistant  
    /3/          0x78    1        119        Jill    Marketing Specialist  
    

이제 테이블이 마케팅 조직으로 모두 채워졌습니다.The table is now fully populated with the Marketing organization.

단원의 다음 태스크Next Task in Lesson

계층 메서드를 사용하여 계층적 테이블 쿼리Querying a Hierarchical Table Using Hierarchy Methods