gpt4 book ai didi

sql-server - 无法在对象中插入重复的键(GetReparentedValue/hierarchyid)

转载 作者:行者123 更新时间:2023-12-03 03:31:43 26 4
gpt4 key购买 nike

使用我在网上找到的示例,我创建了一个函数,该函数使用 GetReparentedValue 重新设置子级的父级。

但是,当我运行代码时,出现以下错误:无法在对象中插入重复的键。

我明白为什么(因为我正在尝试重新设置 child 的父级,而新的父级已经有了 child ,所以我需要知道新父级结构中子级的最大路径(hierarchyid),但我不明白如何我实际上会这么做。

路径0x58

旧路径0x

新路径0x68

SqlCommand command = new SqlCommand("UPDATE Structure SET " +
"Path = " + path + ".GetReparentedValue" +
"(" +
oldPath + ", " + newPath +
")" +
"ParentID = @id " +
"WHERE Path = " + path, _connection);

我在添加 child 时必须这样做,所以我认为需要将其添加到上面的查询中,但我不知道在哪里 path + ".GetDescendant(" + lastChildPath + ", NULL)

数据库表

StructureID   int                         Unchecked  
Path hierarchyid Unchecked
PathLevel ([Path].[GetLevel]()) Checked
Description nvarchar(50) Checked
ParentID int Checked
ParentPath ([Path].[GetAncestor]((1))) Checked

大家有什么建议吗?

提前感谢您的帮助:-)

克莱尔

最佳答案

您可以进行一些更改来使其发挥作用。首先,您不需要表示要移动的节点的父节点的 oldPath。在.GetReparentedValue函数中,输入正在移动的节点的hierarchyid,即path中的值。

第二个更改是添加另一个 SELECT 语句来应用您的 GetDescendant 函数。下面是一个示例脚本,您可以在 SQL Server Management Studio (SSMS) 中尝试该脚本,也可以对其进行更改以合并到 SQLCommand 调用中。前几行(变量声明是赋值)仅用于在 SSMS 中运行。您可以将最后的 SELECTUPDATE 语句传输到调用代码。

DECLARE @Path hierarchyid
DECLARE @oldPath hierarchyid
DECLARE @newPath hierarchyid
SELECT @Path=0x58, @oldPath=0x, @newPath=0x68

SELECT @newPath = @newPath.GetDescendant(MAX(Path), NULL)
FROM Structure
WHERE path.GetAncestor(1)=@newPath;

UPDATE Structure
SET Path = Path.GetReparentedValue(@Path, @newPath)
WHERE Path = @Path;

您的 UPDATE 语句和此修订版只会重新指定单个节点的父级。它不会自动移动移动节点的子节点。移动节点的子节点将成为孤儿。

如果需要移动所选节点及其所有后代,可以使用前面语句的以下变体。

DECLARE @Path hierarchyid
DECLARE @oldPath hierarchyid
DECLARE @newPath hierarchyid
SELECT @Path=0x58, @oldPath=0x, @newPath=0x68

SELECT @newPath = @newPath.GetDescendant(MAX(Path), NULL)
FROM Structure
WHERE Path.GetAncestor(1) = @newPath ;

UPDATE Structure
SET Path = Path.GetReparentedValue(@Path, @newPath)
WHERE Path.IsDescendantOf(@Path) = 1;

实际上,从第一个脚本到此脚本的唯一更改是在最后一行。 Path.IsDescendantOf(@Path) = 1 测试对于 @Path 的所有后代(包括 @Path)均成立。更新后将保持层级关系。

关于sql-server - 无法在对象中插入重复的键(GetReparentedValue/hierarchyid),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3564272/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com