GetDescendant (motor de base de datos)

Se aplica a:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Devuelve el nodo secundario del nodo primario.

Sintaxis

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

Nota:

Para ver la sintaxis de Transact-SQL para SQL Server 2014 (12.x) y versiones anteriores, consulte Versiones anteriores de la documentación.

Argumentos

child1
NULL o el hierarchyid de un nodo secundario del nodo actual.

child2
NULL o el hierarchyid de un nodo secundario del nodo actual.

Tipos de valor devuelto

Tipo de valor devuelto de SQL Server: hierarchyid

Tipo devuelto de CLR: SqlHierarchyId

Observaciones

Devuelve un nodo secundario que es un descendiente del nodo primario.

  • Si el elemento primario es NULL, devolverá NULL.
  • Si el elemento primario no es NULL, y child1 y child2 son NULL, devuelve un elemento secundario del elemento primario.
  • Si el elemento primario y child1 no son NULL y, a su vez, child2 es NULL, devuelve un elemento secundario del elemento primario mayor que child1.
  • Si el elemento primario y child2 no son NULL y, a su vez, child1 es NULL, devuelve un elemento secundario del elemento primario menor que child2.
  • Si el elemento primario, child1 y child2 no son NULL, devuelve un elemento secundario del elemento primario mayor que child1 y menor que child2.
  • Si child1 o child2 no son NULL y no son un elemento secundario del elemento primario, se producirá una excepción.
  • Si child2 no es NULL ni es un elemento secundario del elemento primario, se producirá una excepción.
  • Si child1 >= child2, se producirá una excepción.

GetDescendant es determinista. Por lo tanto, si se llama a GetDescendant con las mismas entradas, siempre producirá la misma salida. Sin embargo, la identidad exacta del nodo secundario producido puede variar en función de su relación con los demás nodos, como se muestra en el ejemplo C.

Ejemplos

A. Insertar una fila como el nodo menos descendiente

Se contrata a un nuevo empleado, que es subordinado de un empleado ya existente en el nodo /3/1/. Ejecute el siguiente código para insertar la nueva fila usando el método GetDescendant sin argumentos para especificar el nodo de la nueva fila como /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. Insertar una fila como un nodo más descendiente

Se contrata a otro empleado nuevo, que es subordinado del mismo jefe que en el ejemplo A. Ejecute el siguiente código para insertar la fila nueva con el método GetDescendant, usando el argumento child1 para especificar que el nodo de la nueva fila vendrá después del nodo del ejemplo A, convirtiéndose en /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. Insertar una fila entre dos nodos existentes

Se contrata a un tercer empleado, subordinado del mismo jefe que en el ejemplo A. Este ejemplo inserta la nueva fila en un nodo mayor que el nodo FirstNewEmployee del ejemplo A y menor que el nodo SecondNewEmployee del ejemplo B. Ejecute el siguiente código con el método GetDescendant. Use los argumentos child1 y child2 para especificar que el nodo de la nueva fila se convertirá en el 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') ;  
  

Después de completar los ejemplos A, B y C, los nodos agregados a la tabla estarán en el mismo nivel que los siguientes valores hierarchyid:

/3/1/1/

/3/1/1.1/

/3/1/2/

El nodo /3/1/1.1/ es mayor que el nodo /3/1/1/, pero está en el mismo nivel de la jerarquía.

D. Ejemplos escalares

SQL Server admite inserciones y eliminaciones arbitrarias de cualquier nodo hierarchyid. Si usa GetDescendant(), siempre podrá generar un nodo entre dos nodos hierarchyid cualesquiera. Ejecute el código siguiente para generar nodos de ejemplo mediante 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. Ejemplo de CLR

En el fragmento de código siguiente se llama al método 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());  

Consulte también

Referencia de los métodos del tipo de datos hierarchyid
Datos jerárquicos (SQL Server)
hierarchyid (Transact-SQL)