GetDescendant (компонент Database Engine)
Возвращает дочерний узел данного родительского узла.
Синтаксис
-- Transact-SQL syntax
parent.GetDescendant ( child1 , child2 )
-- CLR syntax
SqlHierarchyId GetDescendant ( SqlHierarchyId child1 , SqlHierarchyId child2 )
Аргумент
child1
Значение NULL или hierarchyid дочернего узла текущего узла.child2
Значение NULL или hierarchyid дочернего узла текущего узла.
Тип возвращаемых данных
Возвращаемый тип SQL Server: hierarchyid
Возвращаемый тип CLR: SqlHierarchyId
Замечания
Возвращает один дочерний узел, который является потомком родителя.
Если родительская запись — NULL, метод возвращает значение NULL.
Если родительская запись — не NULL, а потомки child1 и child2 — NULL, метод возвращает одного потомка данного родителя.
Если родительская запись и потомок child1 — не NULL, а потомок child2 равен NULL, метод возвращает значение потомка родителя, который больше чем child1.
Если родитель и потомок child2 — не NULL, а потомок child1 равен NULL, метод возвращает значение потомка родителя, который меньше child2.
Если родитель и дочерние узлы child1 и child2 не равны NULL, метод возвращает дочерний узел родителя, который больше child1 и меньше child2.
Если child1 не равен NULL и не является дочерним узлом родителя, то возникает исключение.
Если child2 не равен NULL и не является дочерним узлом родителя, то возникает исключение.
Если child1 >= child2, то возникает исключение.
Аргумент GetDescendant детерминирован. Поэтому, если GetDescendant вызван с теми же входными данными, выход будет таким же. Однако точный идентификатор полученного дочернего элемента может быть различным в зависимости от связей с другими узлами, как показано в примере В.
Примеры
А.Вставка строки как наименьшего узла-потомка
Новый сотрудник принят на работу, подотчетный существующему сотруднику в узле /3/1/. Выполните следующий код, чтобы вставить новую строку с использованием метода GetDescendant без аргументов, указав новый узел строк как /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') ;
Б.Вставка строки как наибольшего узла-потомка
Еще один новый сотрудник принят на работу и подчиняется тому же начальнику, что и в примере А. Выполните следующий код, чтобы вставить новую строку с помощью метода GetDescendant, где аргумент child 1 указывает, что узел новой строки последует за узлом в примере А и примет вид /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') ;
В.Вставка строки между двумя существующими узлами
Третий новый сотрудник принят на работу и подчиняется тому же начальнику, что и в примере А. В этом примере новая строка вставляется в узел, который больше FirstNewEmployee в примере А и меньше SecondNewEmployee в примере Б. Выполните следующий код с помощью метода GetDescendant. Используйте как аргумент child1, так и аргумент child2, чтобы указать, что узел новой строки будет узлом /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') ;
После завершения примеров А, Б и В, узлы, добавленные в таблицу, будут одноранговыми со следующими значениями hierarchyid:
/3/1/1/
/3/1/1.1/
/3/1/2/
Узел /3/1/1.1/ больше узла /3/1/1/, но находится на том же уровне иерархии.
Г.Скалярные примеры
SQL Server поддерживает произвольные вставки и удаления любых узлов hierarchyid. С помощью метода GetDescendant() можно всегда создать узел между двумя любыми узлами hierarchyid. Выполните следующий код, чтобы сформировать образцы узлов с использованием 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()
Д.Пример CLR
В следующем фрагменте кода вызывается метод 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());