2014-11-04 39 views
0

我有一个简单的表字段:如何复制带有hierarchyid的分支?

catalog_id hierarchyid NOT NULL UNIQUE, 
item_id int NOT NULL identity(1,1), 
item_name nvarchar(50) NOT NULL,  

enter image description here

我需要一个存储过程,将分支复制到另一个父。

例如,这样的事情:

enter image description here

我做的过程从一个父移动一个分支到另一个,那就是:

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)[email protected] ; 

UPDATE CatalogsTree 
SET catalog_id = catalog_id.GetReparentedValue(@nold, @nnew) 
WHERE catalog_id.IsDescendantOf(@nold) = 1 ; 

COMMIT TRANSACTION 

但现在我需要使用相同的层次结构和item_name制作副本。

+0

你的表是尖叫出去'parentId'列。所以'item_id:11'应该有'parent_id:9'。它会让生活变得更简单。 – Tanner 2014-11-04 11:27:58

回答

0

我已经与临时表使其

ALTER PROCEDURE [dbo].[copy_child] 
@folder_id int, 
@new_parent_id int 
AS 
BEGIN 

创建临时表:

create table #temp_table(
    catalog_id hierarchyid NOT NULL UNIQUE, 
    item_id int NOT NULL,   
    item_name nvarchar(50) NOT NULL 
) 

副本分公司临时表:

declare @FolderId hierarchyid 
select @FolderId = (select catalog_id from CatalogsTree where item_id = @folder_id) 
INSERT INTO #temp_table (catalog_id, item_id, item_name) 
SELECT catalog_id, item_id, item_name FROM CatalogsTree Where catalog_id.IsDescendantOf(@FolderId) = 1 

变化catalog_id:

DECLARE @nold hierarchyid, @nnew hierarchyid 
SELECT @nold = catalog_id FROM CatalogsTree WHERE item_id = @folder_id 

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE 
BEGIN TRANSACTION 
SELECT @nnew = catalog_id FROM CatalogsTree WHERE item_id = @new_parent_id 

SELECT @nnew = @nnew.GetDescendant(max(catalog_id), NULL) 
FROM CatalogsTree WHERE catalog_id.GetAncestor(1) = @nnew ; 

UPDATE #temp_table  
SET catalog_id = catalog_id.GetReparentedValue(@nold, @nnew) 
WHERE catalog_id.IsDescendantOf(@nold) = 1 ; 
COMMIT TRANSACTION 

副本中更改值主表:

INSERT INTO CatalogsTree(catalog_id, item_name) 
SELECT catalog_id, item_name FROM #temp_table 

drop table #temp_table 
END 
相关问题