GetDescendant(데이터베이스 엔진)

적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

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

Syntax

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

참고 항목

SQL Server 2014(12.x) 및 이전 버전에 대한 Transact-SQL 구문을 보려면 이전 버전 설명서를 참조 하세요.

인수

child1
NULL 또는 현재 노드의 자식 계층 구조입니다.

child2
NULL 또는 현재 노드의 자식 계층 구조입니다.

반환 형식

SQL Server 반환 형식: hierarchyid

CLR 반환 형식:SqlHierarchyId

설명

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

  • 부모가 NULL이면 NULL을 반환합니다.
  • 부모가 NULL이 아니고 자식1과 자식2가 모두 NULL인 경우 는 부모의 자식을 반환합니다.
  • parent와 child1이 NULL이 아니고 child2가 NULL인 경우 child1보다 큰 부모의 자식을 반환합니다.
  • parent와 child2가 NULL이 아니고 child1이 NULL이면 자식2보다 작은 부모의 자식이 반환됩니다.
  • parent, child1 및 child2가 NULL이 아니면 자식1보다 크고 자식2보다 작은 부모의 자식이 반환됩니다.
  • child1이 NULL도 아니고 부모의 자식도 아닌 경우 예외가 발생합니다.
  • child2가 NULL이 아니고 부모의 자식이 아닌 경우 예외가 발생합니다.
  • child1이 child2보다 크거나 같으면 예외가 발생합니다.

GetDescendant는 결정적입니다. 따라서 GetDescendant가 동일한 입력으로 호출되면 항상 동일한 출력이 생성됩니다. 그러나 생성된 자식의 정확한 ID는 예제 C에 설명된 것처럼 다른 노드와의 관계에 따라 달라질 수 있습니다.

예제

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

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

DECLARE @Manager hierarchyid;   
SET @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') ;  

B. 행을 더 큰 하위 노드로 삽입

다른 새 직원이 고용되어 예제 A와 동일한 관리자에게 보고합니다. 다음 코드를 실행하여 자식 1 인수를 사용하여 GetDescendant 메서드를 사용하여 새 행을 삽입하여 새 행의 노드가 예제 A /3/1/2/의 노드를 따르도록 지정합니다.

DECLARE @Manager hierarchyid, @Child1 hierarchyid;  
  
SET @Manager = CAST('/3/1/' AS hierarchyid);  
SET @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') ;  

C. 두 기존 노드 사이에 행 삽입

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

DECLARE @Manager hierarchyid, @Child1 hierarchyid, @Child2 hierarchyid;  
  
SET @Manager = CAST('/3/1/' AS hierarchyid);  
SET @Child1 = CAST('/3/1/1/' AS hierarchyid);  
SET @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') ;  
  

예제 A, B 및 C를 완료한 후 테이블에 추가된 노드는 다음 계층 구조 값을 가진 피어가 됩니다.

/3/1/1/

/3/1/1.1/

/3/1/2/

노드 /3/1/1.1/ 가 노드 /3/1/1/ 보다 크지만 계층 구조에서 동일한 수준입니다.

D. 스칼라 예

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();  

E. 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());  

참고 항목

hierarchyid 데이터 형식 메서드 참조
계층적 데이터(SQL Server)
hierarchyid(Transact-SQL)