GetReparentedValue (компонент Database Engine)
Возвращает узел, путь к которому от корня — это путь к newRoot, за которым следует путь от oldRoot к данному корню.
Синтаксис
-- Transact-SQL syntax
node. GetReparentedValue ( oldRoot, newRoot )
-- CLR syntax
SqlHierarchyId GetReparentedValue ( SqlHierarchyId oldRoot , SqlHierarchyId newRoot )
Аргументы
oldRoot
hierarchyid — узел, представляющий уровень иерархии, который подлежит изменению.newRoot
hierarchyid — представляет узел, которым будет заменен раздел oldRoot текущего узла при перемещении узла.
Типы возвращаемых данных
**Возвращаемый тип данных SQL Server:**hierarchyid
**Возвращаемый тип данных CLR:**SqlHierarchyId
Замечания
Может использоваться для изменения дерева путем перемещения узлов из oldRoot в newRoot. Метод GetReparentedValue может быть использован для перемещения узла иерархии в новое местоположение в иерархии. Тип данных hierarchyid представляет, но не обеспечивает соблюдение иерархической структуры. Пользователям необходимо убедиться в том, что структура идентификатора иерархии пригодна для нового местоположения. Уникальный индекс с типом данных hierarchyid позволяет избежать повторения записей. Пример перемещения поддерева целиком см. в разделе Работа с данными hierarchyid.
Примеры
А. Сравнение двух местоположений узла
В следующем примере показан текущий идентификатор иерархии для узла. В нем также демонстрируется, как будет выглядеть hierarchyid узла, если при перемещении данный узел станет потомком узла @NewParent. В примере используется метод ToString() для демонстрации иерархических связей.
DECLARE @SubjectEmployee hierarchyid , @OldParent hierarchyid, @NewParent hierarchyid
SELECT @SubjectEmployee = OrgNode FROM HumanResources.EmployeeDemo
WHERE LoginID = 'adventure-works\gail0' ;
SELECT @OldParent = OrgNode FROM HumanResources.EmployeeDemo
WHERE LoginID = 'adventure-works\roberto0' ; -- who is /1/1/
SELECT @NewParent = OrgNode FROM HumanResources.EmployeeDemo
WHERE LoginID = 'adventure-works\wanida0' ; -- who is /2/3/
SELECT OrgNode.ToString() AS Current_OrgNode_AS_Text,
(@SubjectEmployee. GetReparentedValue(@OldParent, @NewParent) ).ToString() AS Proposed_OrgNode_AS_Text,
OrgNode AS Current_OrgNode,
@SubjectEmployee. GetReparentedValue(@OldParent, @NewParent) AS Proposed_OrgNode,
FROM HumanResources.EmployeeDemo
WHERE OrgNode = @SubjectEmployee ;
GO
Б. Перемещение узла в новое местоположение путем обновления
В следующем примере используется метод GetReparentedValue() в инструкции UPDATE для перемещения узла из прежнего в новое местоположение в иерархии.
DECLARE @SubjectEmployee hierarchyid , @OldParent hierarchyid, @NewParent hierarchyid
SELECT @SubjectEmployee = OrgNode FROM HumanResources.EmployeeDemo
WHERE LoginID = 'adventure-works\gail0' ; -- Node /1/1/2/
SELECT @OldParent = OrgNode FROM HumanResources.EmployeeDemo
WHERE LoginID = 'adventure-works\roberto0' ; -- Node /1/1/
SELECT @NewParent = OrgNode FROM HumanResources.EmployeeDemo
WHERE LoginID = 'adventure-works\wanida0' ; -- Node /2/3/
UPDATE HumanResources.EmployeeDemo
SET OrgNode = @SubjectEmployee. GetReparentedValue(@OldParent, @NewParent)
WHERE OrgNode = @SubjectEmployee ;
SELECT OrgNode.ToString() AS Current_OrgNode_AS_Text,
FROM HumanResources.EmployeeDemo
WHERE LoginID = 'adventure-works\gail0' ; -- Now node /2/3/2/
В. Пример CLR
В следующем фрагменте кода вызывается метод GetReparentedValue ().
this. GetReparentedValue(oldParent, newParent)