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