GetDescendant (motor de base de datos)

Devuelve el nodo secundario del nodo primario.

Sintaxis

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

-- CLR syntax
SqlHierarchyId GetDescendant ( SqlHierarchyId child1 , SqlHierarchyId child2 ) 

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 valores devueltos

Tipo de valor devuelto de SQL Server: hierarchyidhierarchyid

Tipo de valor devuelto de CLR: SqlHierarchyIdSqlHierarchyId

Notas

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 código siguiente 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 
SELECT @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 código siguiente para insertar la fila nueva con el método GetDescendant, usando el argumento child1 para especificar que el nodo de la nueva fila vendrá a continuación del nodo del ejemplo A, convirtiéndose en /3/1/2/:

DECLARE @Manager hierarchyid, @Child1 hierarchyid

SELECT @Manager = CAST('/3/1/' AS hierarchyid)
SELECT @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 código siguiente 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

SELECT @Manager = CAST('/3/1/' AS hierarchyid)
SELECT @Child1 = CAST('/3/1/1/' AS hierarchyid)
SELECT @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 valores hierarchyid siguientes:

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