GetReparentedValue(数据库引擎)

返回一个节点,其相对于根的路径是指向 newRoot 的路径,后跟从 oldRoot 到 this 的路径。

语法

-- 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 数据类型的唯一索引有助于避免重复条目。 有关移动整个子树的示例,请参阅层次结构数据 (SQL Server)

示例

A.比较两个节点位置

以下示例显示了节点的当前 hierarchyid。 它还显示了如果节点没有移动为 @NewParent 节点的后代,节点的 hierarchyid 将会是什么。 它使用 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

B.将节点更新到新位置

下面的示例在 UPDATE 语句中使用 GetReparentedValue() 将节点从层次结构中的旧位置移到新位置。

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/

C.CLR 示例

下面的代码段调用 GetReparentedValue () 方法:

this. GetReparentedValue(oldParent, newParent)

请参阅

参考

hierarchyid (Transact-SQL)

概念

hierarchyid 数据类型方法引用

层次结构数据 (SQL Server)