Sdílet prostřednictvím


GetDescendant (databázový stroj)

platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL databáze v Microsoft Fabric

Vrátí podřízený uzel nadřazeného objektu.

Syntax

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

Arguments

child1
NULL nebo hierarchyid podřízeného uzlu.

child2
NULL nebo hierarchyid podřízeného uzlu.

Návratové typy

Návratový typ:hierarchyid SQL Serveru

návratový typ CLR:SqlHierarchyId

Remarks

Vrátí jeden podřízený uzel, který je potomkem nadřazeného objektu.

  • Pokud je nadřazený hodnota NULL, vrátí hodnotu NULL.
  • Pokud nadřazený objekt nemá hodnotu NULL a podřízený1 i podřízený2 má hodnotu NULL, vrátí podřízenou položku nadřazeného objektu.
  • Pokud nadřazený a podřízený1 nemá hodnotu NULL a podřízený2 má hodnotu NULL, vrátí podřízenou položku nadřazené položky větší než podřízená1.
  • Pokud nadřazené a podřízené 2 nemají hodnotu NULL a podřízený1 má hodnotu NULL, vrátí podřízenou položku nadřazené položky menší než podřízená2.
  • Pokud nadřazený, podřízený1 a podřízený2 nemá hodnotu NULL, vrátí podřízenou položku nadřazené položky větší než podřízená1 a menší než podřízená2.
  • Pokud podřízená položka1 není NULL a není podřízenou nadřazenou položkou, je vyvolána výjimka.
  • Pokud podřízená hodnota2 není NULL a není podřízenou nadřazenou položkou, je vyvolána výjimka.
  • Pokud je podřízený1 >= podřízený2, vyvolá se výjimka.

GetDescendant je deterministický. Proto pokud GetDescendant je volána se stejnými vstupy, vždy vytvoří stejný výstup. Přesná identita vytvořeného dítěte se ale může lišit v závislosti na jeho vztahu k ostatním uzlům, jak je znázorněno v příkladu C.

Examples

A. Vložení řádku jako nejmenšího potomka uzlu

Nový zaměstnanec je přijat a hlásí stávajícímu zaměstnanci na uzlu /3/1/. Spuštěním následujícího kódu vložte nový řádek pomocí metody GetDescendant bez argumentů pro zadání nového uzlu řádků 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. Vložení řádku jako většího potomka uzlu

Jiný nový zaměstnanec je přijat, který hlásí stejnému nadřízenýmu jako v příkladu A. Spuštěním následujícího kódu vložte nový řádek pomocí metody GetDescendant pomocí podřízeného 1 argumentu, který určuje, že uzel nového řádku bude následovat za uzlem v příkladu A a stane se /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. Vložení řádku mezi dva existující uzly

Třetí zaměstnanec je přijat a hlásí se stejnému manažeru jako v příkladu A. Tento příklad vloží nový řádek do uzlu větší než FirstNewEmployee v příkladu A a menší než SecondNewEmployee v příkladu B. Pomocí metody GetDescendant spusťte následující kód. Pomocí argumentu child1 a child2 určete, že uzel nového řádku se stane uzlem /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 dokončení příkladů A, B a C budou uzly přidané do tabulky partnerské vztahy s následujícími id hierarchie hodnotami:

/3/1/1/

/3/1/1.1/

/3/1/2/

/3/1/1.1/ uzlu je větší než /3/1/1/ uzlů, ale na stejné úrovni v hierarchii.

D. Skalární příklady

SQL Server podporuje libovolné vkládání a odstraňování všech hierarchií uzlů. Pomocí metody GetDescendant() je vždy možné vygenerovat uzel mezi libovolnými dvěma hierarchyid uzly. Spuštěním následujícího kódu vygenerujte ukázkové uzly pomocí 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. Příklad CLR

Následující fragment kódu volá metodu 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());  

Viz také

referenční metody datového typu hierarchie
hierarchických dat (SQL Server)
hierarchyid (Transact-SQL)