フィールドを持つ単純なテーブルがあります:
catalog_id hierarchyid NOT NULL UNIQUE,
item_id int NOT NULL identity(1,1),
item_name nvarchar(50) NOT NULL,
ブランチを別の親にコピーするストアド プロシージャを作成する必要があります。
たとえば、次のようなものです。
1 つのブランチをある親から別の親に移動する手順を実行しました。
ALTER PROCEDURE [dbo].[move_child]
@ChildId int,
@NewParentId int
AS
DECLARE @nold hierarchyid, @nnew hierarchyid
SELECT @nold = catalog_id FROM CatalogsTree WHERE item_id = @ChildId
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION
SELECT @nnew = catalog_id FROM CatalogsTree WHERE item_id = @NewParentId
SELECT @nnew = @nnew.GetDescendant(max(catalog_id), NULL)
FROM CatalogsTree WHERE catalog_id.GetAncestor(1)=@nnew ;
UPDATE CatalogsTree
SET catalog_id = catalog_id.GetReparentedValue(@nold, @nnew)
WHERE catalog_id.IsDescendantOf(@nold) = 1 ;
COMMIT TRANSACTION
しかし今、同じ階層と item_name でコピーを作成する必要があります。