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)