GetDescendant (Motore di database)
Si applica a: SQL Server
database SQL di Azure Istanza gestita di SQL di Azure
Restituisce il nodo figlio di un nodo padre.
Sintassi
-- Transact-SQL syntax
parent.GetDescendant ( child1 , child2 )
-- CLR syntax
SqlHierarchyId GetDescendant ( SqlHierarchyId child1 , SqlHierarchyId child2 )
Nota
Per visualizzare la sintassi Transact-SQL per SQL Server 2014 (12.x) e versioni precedenti, vedere Documentazione delle versioni precedenti.
Argomenti
child1
NULL o il valore hierarchyid di un figlio del nodo corrente.
child2
NULL o il valore hierarchyid di un figlio del nodo corrente.
Tipi restituiti
Tipo SQL Server restituito: hierarchyid
Tipo CLR restituito: SqlHierarchyId
Osservazioni:
Restituisce un nodo figlio discendente del padre.
- Se il padre è Null, restituisce Null.
- Se il padre è diverso da Null e child1 e child2 sono Null, restituisce un figlio del padre.
- Se il padre e child1 sono diversi da Null e child2 è NULL, restituisce un figlio del padre maggiore di child1.
- Se il padre e child2 sono diversi da Null e child1 è Null, restituisce un figlio del padre minore di child2.
- Se il padre, child1 e child2 sono diversi da Null, restituisce un figlio del padre maggiore di child1 e minore di child2.
- Se child1 è diverso da Null, ma non è un figlio del padre, viene generata un'eccezione.
- Se child2 è diverso da Null, ma non è un figlio del padre, viene generata un'eccezione.
- Se child1 >= child2, viene generata un'eccezione.
GetDescendant è deterministico. Pertanto, se viene chiamato con gli stessi input GetDescendant restituisce sempre lo stesso output. L'identità esatta del figlio restituito può tuttavia variare in base alla relazione con gli altri nodi, come dimostrato nell'esempio C.
Esempi
R. Inserimento di una riga come ultimo nodo discendente
Viene assunto un nuovo dipendente, messo in relazione con un dipendente esistente nel nodo /3/1/
. Eseguire il codice seguente per inserire la nuova riga usando il metodo GetDescendant senza argomenti per specificare il nuovo nodo delle righe come /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. Inserimento di una riga come nodo discendente maggiore
Viene assunto un altro nuovo dipendente, che risponde allo stesso responsabile dell'esempio A. Eseguire il codice seguente per inserire la nuova riga mediante il metodo GetDescendant, usando l'argomento child1 per specificare che il nodo della nuova riga seguirà il nodo dell'esempio A, divenendo /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. Inserimento di una riga tra due nodi esistenti
Viene assunto un terzo dipendente, che risponde allo stesso responsabile dell'esempio A. In questo esempio viene inserita la nuova riga in un nodo maggiore di FirstNewEmployee
dell'esempio A e minore di SecondNewEmployee
nell'esempio B. Eseguire il codice seguente usando il metodo GetDescendant. Utilizzare sia l'argomento child1 che l'argomento child2 per specificare che il nodo della nuova riga diventerà il nodo /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') ;
Dopo il completamento degli esempi A, B e C i nodi aggiunti alla tabella si troveranno allo stesso livello dei valori hierarchyid seguenti:
/3/1/1/
/3/1/1.1/
/3/1/2/
Il nodo /3/1/1.1/
è maggiore del nodo /3/1/1/
, ma si trova allo stesso livello della gerarchia.
D. Esempi scalari
SQL Server supporta eliminazioni e inserimenti arbitrari di qualsiasi nodo hierarchyid. Usando GetDescendant() è sempre possibile generare un nodo tra due nodi hierarchyid qualsiasi. Eseguire il codice seguente per generare nodi di esempio utilizzando 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. Esempio CLR
Nel frammento di codice seguente viene chiamato il metodo 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());
Vedi anche
Guida di riferimento ai metodi per il tipo di dati hierarchyid
Hierarchical Data (SQL Server)
hierarchyid (Transact-SQL)