Поделиться через


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)