Udostępnij za pomocą


GetDescendant (aparat bazy danych)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBaza danych SQL w usłudze Microsoft Fabric

Zwraca węzeł podrzędny elementu nadrzędnego.

Syntax

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

Arguments

child1
Wartość NULL lub hierarchyid elementu podrzędnego bieżącego węzła.

child2
Wartość NULL lub hierarchyid elementu podrzędnego bieżącego węzła.

Typy zwracane

zwracany typ programu SQL Server:hierarchyid

clR zwraca typ:SqlHierarchyId

Remarks

Zwraca jeden węzeł podrzędny, który jest elementem potomnym elementu nadrzędnego.

  • Jeśli element nadrzędny ma wartość NULL, zwraca wartość NULL.
  • Jeśli element nadrzędny nie ma wartości NULL, a zarówno element podrzędny child1, jak i podrzędny2 mają wartość NULL, zwraca element podrzędny elementu nadrzędnego.
  • Jeśli element nadrzędny i podrzędny1 nie mają wartości NULL, a element child2 ma wartość NULL, zwraca element podrzędny elementu nadrzędnego większego niż podrzędny1.
  • Jeśli element nadrzędny i podrzędny2 nie mają wartości NULL, a element podrzędny 1 ma wartość NULL, zwraca element podrzędny elementu nadrzędnego mniejszego niż podrzędny2.
  • Jeśli element nadrzędny, podrzędny1 i podrzędny2 nie mają wartości NULL, zwraca element podrzędny elementu nadrzędnego większego niż podrzędny1 i mniejszy niż podrzędny2.
  • Jeśli element child1 nie ma wartości NULL, a nie element podrzędny elementu nadrzędnego, zostanie zgłoszony wyjątek.
  • Jeśli element child2 nie ma wartości NULL, a nie element podrzędny elementu nadrzędnego, zostanie zgłoszony wyjątek.
  • Jeśli element child1 >= child2, zostanie zgłoszony wyjątek.

GetDescendant jest deterministyczny. W związku z tym, jeśli funkcja GetDescendant jest wywoływana z tymi samymi danymi wejściowymi, zawsze będzie generować te same dane wyjściowe. Jednak dokładna tożsamość wygenerowanego elementu podrzędnego może się różnić w zależności od jego relacji z innymi węzłami, jak pokazano w przykładzie C.

Examples

A. Wstawianie wiersza jako najmniej węzła podrzędnego

Nowy pracownik jest zatrudniony, zgłaszając istniejącego pracownika w węźle /3/1/. Wykonaj następujący kod, aby wstawić nowy wiersz przy użyciu metody GetDescendant bez argumentów, aby określić nowy węzeł wierszy jako /3/1/1/:

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. Wstawianie wiersza jako większego węzła podrzędnego

Inny nowy pracownik jest zatrudniony, zgłaszając go do tego samego menedżera, co w przykładzie A. Wykonaj następujący kod, aby wstawić nowy wiersz przy użyciu metody GetDescendant przy użyciu argumentu podrzędnego 1, aby określić, że węzeł nowego wiersza będzie podążać za węzłem w przykładzie A, stając się /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. Wstawianie wiersza między dwoma istniejącymi węzłami

Trzeci pracownik jest zatrudniony, zgłaszając go do tego samego menedżera, co w przykładzie A. W tym przykładzie nowy wiersz jest wstawiany do węzła większego niż FirstNewEmployee w przykładzie A, a mniej niż SecondNewEmployee w przykładzie B. Wykonaj następujący kod przy użyciu metody GetDescendant. Użyj zarówno argumentu child1, jak i argumentu child2, aby określić, że węzeł nowego wiersza stanie się węzłem /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') ;  
  

Po ukończeniu przykładów A, B i C węzły dodane do tabeli będą elementami równorzędnymi z następującymi wartościami hierarchyid:

/3/1/1/

/3/1/1.1/

/3/1/2/

Węzeł /3/1/1.1/ jest większy niż węzeł /3/1/1/, ale na tym samym poziomie w hierarchii.

D. Przykłady skalarne

Program SQL Server obsługuje dowolne wstawiania i usuwania wszystkich węzłów hierarchiiid. Za pomocą metody GetDescendant() zawsze można wygenerować węzeł między dowolnymi dwoma węzłami hierarchią węzłów. Wykonaj następujący kod, aby wygenerować przykładowe węzły przy użyciu 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. Przykład CLR

Poniższy fragment kodu wywołuje metodę 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());  

Zobacz także

hierarchyid odwołanie do metody typu danych
danych hierarchicznych (SQL Server)
hierarchyid (Transact-SQL)