2014-11-04 23 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 
相關問題