다음을 통해 공유


GetDescendant(데이터베이스 엔진)

부모의 자식 노드를 반환합니다.

구문

-- Transact-SQL syntax
parent.GetDescendant ( child1 , child2 ) 

-- CLR syntax
SqlHierarchyId GetDescendant ( SqlHierarchyId child1 , SqlHierarchyId child2 ) 

인수

  • child1
    NULL 또는 현재 노드의 자식에 대한 hierarchyid입니다.

  • child2
    NULL 또는 현재 노드의 자식에 대한 hierarchyid입니다.

반환 형식

**SQL Server 반환 형식:**hierarchyid

**CLR 반환 형식:**SqlHierarchyId

주의

부모의 하위 항목인 자식 노드 하나를 반환합니다.

  • parent가 NULL인 경우 NULL을 반환합니다.

  • parent가 NULL이 아니고 child1과 child2가 모두 NULL인 경우 부모의 자식을 반환합니다.

  • parent와 child1이 NULL이 아니고 child2가 NULL인 경우 child1보다 큰 부모의 자식을 반환합니다.

  • parent와 child2가 NULL이 아니고 child1이 NULL인 경우 child2보다 작은 부모의 자식을 반환합니다.

  • parent, child1 및 child2가 NULL이 아닌 경우 <codeInline>GetDescendant</codeInline>는 child1보다 크고 child2보다 작은 부모의 자식을 반환합니다.

  • child1이 NULL도 아니고 부모의 자식도 아닌 경우 예외가 발생합니다.

  • child2가 NULL도 아니고 부모의 자식도 아닌 경우 예외가 발생합니다.

  • child1이 child2보가 크거나 같으면 예외가 발생합니다.

GetDescendant는 결정적입니다. 따라서 GetDescendant를 같은 입력을 사용하여 호출하면 항상 같은 출력이 생성됩니다. 그러나 생성되는 자식의 정확한 ID는 예 3에 표시된 대로 다른 노드와의 관계에 따라 달라질 수 있습니다.

1. 행을 가장 작은 항목 노드로 삽입

노드 /3/1/에 있는 기존 직원에게 보고하는 새 직원을 고용합니다. 다음 코드를 실행하여 새 행을 추가합니다. 여기서는 새 행 노드를 /3/1/1/로 지정하는 인수 없이 GetDescendant 메서드를 사용합니다.

DECLARE @Manager hierarchyid 
SELECT @Manager = CAST('/3/1/' AS hierarchyid)

INSERT HumanResources.EmployeeDemo (OrgNode, LoginID, Title, HireDate)
VALUES
(@Manager.GetDescendant(NULL, NULL),
'adventure-works\FirstNewEmployee', 'Application Intern', '3/11/07') ;

2. 행을 큰 하위 항목 노드로 삽입

예 1과 같은 관라자에게 보고하는 다른 새 직원을 고용합니다. 다음 코드를 실행하여 새 행을 삽입합니다. 여기서는 GetDescendant 메서드에서 새 행의 노드가 예 1의 노드 다음에 오도록 즉, /3/1/2/가 되도록 지정하는 child1 인수를 사용합니다.

DECLARE @Manager hierarchyid, @Child1 hierarchyid

SELECT @Manager = CAST('/3/1/' AS hierarchyid)
SELECT @Child1 = CAST('/3/1/1/' AS hierarchyid)

INSERT HumanResources.EmployeeDemo (OrgNode, LoginID, Title, HireDate)
VALUES
(@Manager.GetDescendant(@Child1, NULL),
'adventure-works\SecondNewEmployee', 'Application Intern', '3/11/07') ;

3. 행을 기존의 두 노드 사이에 삽입

예 1과 같은 관리자에게 보고하는 세 번째 직원을 고용합니다. 이 예에서는 예 1의 FirstNewEmployee보다 크고 예 2의 SecondNewEmployee보다 작은 노드에 새 행을 삽입니다. GetDescendant 메서드를 사용하여 다음 코드를 실행합니다. child1 인수와 child2 인수를 모두 사용하여 새 행의 노드가 노드 /3/1/1.1/이 되도록 지정합니다.

DECLARE @Manager hierarchyid, @Child1 hierarchyid, @Child2 hierarchyid

SELECT @Manager = CAST('/3/1/' AS hierarchyid)
SELECT @Child1 = CAST('/3/1/1/' AS hierarchyid)
SELECT @Child2 = CAST('/3/1/2/' AS hierarchyid)

INSERT HumanResources.EmployeeDemo (OrgNode, LoginID, Title, HireDate)
VALUES
(@Manager.GetDescendant(@Child1, @Child2),
'adventure-works\ThirdNewEmployee', 'Application Intern', '3/11/07') ;

예 1, 2 및 3을 완료하면 테이블에 추가된 노드가 다음 hierarchyid 값과 피어가 됩니다.

/3/1/1/

/3/1/1.1/

/3/1/2/

노드 /3/1/1.1/은 노드 /3/1/1/보다 크지만 같은 계층 수준에 있습니다.

4. 스칼라 예

SQL Server에서는 모든 hierarchyid 노드의 임의 삽입과 삭제를 지원합니다. **GetDescendant()**를 사용하면 임의의 두 hierarchyid 노드 사이에 노드를 생성할 수 있습니다. 다음 코드에서는 GetDescendant를 사용하여 예제 노드를 생성합니다.

DECLARE @h hierarchyid = hierarchyid::GetRoot()
DECLARE @c hierarchyid = @h.GetDescendant(NULL, NULL)
SELECT @c.ToString()
DECLARE @c2 hierarchyid = @h.GetDescendant(@c, NULL)
SELECT @c2.ToString()
SET @c2 = @h.GetDescendant(@c, @c2)
SELECT @c2.ToString()
SET @c = @h.GetDescendant(@c, @c2)
SELECT @c.ToString()
SET @c2 = @h.GetDescendant(@c, @c2)
SELECT @c2.ToString()

5. CLR 예

다음 코드 조각에서는 GetDescendant() 메서드를 호출합니다.

SqlHierarchyId parent, child1, child2;
parent = SqlHierarchyId.GetRoot();
child1 = parent.GetDescendant(SqlHierarchyId.Null, SqlHierarchyId.Null);
child2 = parent.GetDescendant(child1, SqlHierarchyId.Null);
Console.Write(parent.GetDescendant(child1, child2).ToString());