2013-03-04 89 views
0

我目前正在編寫一個存儲過程,它創建一個現有對象的確切副本。 對象使用多個表,在這些表2使用許多一對多的關係:多對多關係中引用的重複記錄

這裏使用的模式:

--------------------------------------- 
      tbl_AssociationA 
--------------------------------------- 
ID | ObjectID | Description 
--------------------------------------- 
1 | 12  | 'Some description' 
2 | 12  | 'Some text here' 
3 | 13  | 'Some words here' 
       ... 
--------------------------------------- 


--------------------------------------- 
      tbl_AssociationB 
--------------------------------------- 
ID | ObjectID | LabelText 
--------------------------------------- 
1 | 12  | 'Foo' 
2 | 12  | 'Foo foo' 
3 | 13  | 'Some words...' 
4 | 13  | 'Some other Foos' 
5 | 14  | 'Some foos here' 
6 | 12  | 'Some other words' 
       ... 
--------------------------------------- 


------------------------- 
    tbl_RelationAB 
------------------------- 
ID_A  | ID_B 
------------------------- 
1   | 1  
2   | 1  
2   | 2  
2   | 6  
3   | 4  
3   | 3  
      ... 
------------------------ 

現在,讓我們說,我想創建的Object 12副本(我們稱之爲Object X)。我想複製tbl_AssociationAtbl_AssociationB中的記錄,因爲我不想對Object X進行進一步修改以修改Object 12

所以,創造tbl_AssociationAtbl_AssociationB新的記錄,我會用這樣的:

INSERT INTO tbl_AssociationA 
SELECT @NewId,Description FROM tbl_AssociationA WHERE [email protected]; 

INSERT INTO tbl_AssociationB 
SELECT @NewId,LabelText FROM tbl_AssociationB WHERE [email protected]; 

我怎樣才能插入tbl_RelationAB使用這些新創建的記錄。請注意,tbl_AssociationAtbl_AssociationB中的列IDIDENTITY

+0

使用scope_identity檢索Iden http://msdn.microsoft.com/en-us/library/ms190315.aspx – Paparazzi 2013-03-04 17:00:53

回答

2

好了,所以這筆交易是:

我要複製對象X到對象Z. 對象X是tbl_AssociationAtblAssociationB引用與外鍵ObjectID。 第三個表格tbl_RelationAB指定了tbl_AssociationA.IDtbl_AssociationB.ID之間的多對多映射。

在此解決方案中,對象X以@originalObjectID和對象Z與@copiedObjectID引用。 2個臨時表@TempA@TempB用於保留tbl_AssociationAtbl_AssociationB的新舊自動生成的ID列之間的映射。

DECLARE @TempA AS TABLE (newID INT, oldID INT); 
DECLARE @TempB AS TABLE (newID INT, oldID INT); 

MERGE tbl_AssociationA AS tbl_a 
USING (
    SELECT ID, ObjectID, Description 
    FROM tbl_AssociationA WHERE [email protected] 
) as old_tbl_a 
ON 1=0 
WHEN NOT MATCHED BY TARGET THEN 
    INSERT (ObjectID,Description) VALUES (@copiedObjectID,Description) 
    OUTPUT INSERTED.ID,old_tbl_a.ID INTO @TempA; 

MERGE tbl_AssociationB AS tbl_b 
USING (
    SELECT ID, ObjectID, LabelText 
    FROM tbl_AssociationB WHERE [email protected] 
) as old_tbl_b 
ON 1=0 
WHEN NOT MATCHED BY TARGET THEN 
    INSERT (ObjectID,LabelText) VALUES (@copiedObjectID,LabelText) 
    OUTPUT INSERTED.ID,old_tbl_b.ID INTO @TempB; 

INSERT INTO tbl_RelationAB 
SELECT a.newID,b.newID 
FROM tbl_RelationAB tbl_ab 
INNER JOIN @TempA a ON tbl_ab.ID_A = a.oldID 
INNER JOIN @TempB b ON tbl_ab.ID_B = b.oldID; 

所以表tbl_RelationAB隨後也被複制之間的關係的新的自動生成tbl_AssociationA.IDtbl_AssociationB.ID。希望這可以幫助未來的人!

2

我正在重複使用同一個表並且沒有插入。
但是這顯示瞭如何檢索兩個標識並在聲明中使用它們。

set nocount on; 
    declare @idenA SmallInt, @idenB SmallInt; 
    insert into Table_1(value) values('a'); 
    set @idenA = scope_identity(); 
    insert into Table_1(value) values('b'); 
    set @idenB = scope_identity(); 
    print @idenA; 
    print @idenB; 

    insert into Table_1 (value) 
    OUTPUT inserted.* 
    select top 2 value from Table_1 

但我明白,不是一個完整的回答你的問題。
我認爲你將需要輸出到臨時表。
一旦你得到更好的答案,我會刪除這一個。

+0

@NewID是新生成的ObjectID,但該插入將爲表'tbl_AssociationA'生成多個標識並且'tbl_AssociationB'。這些多個自動生成的ID,我不知道如何檢索它們全部... – 2013-03-04 18:09:04

+0

好的我關注。使用OUTPUT。查看更新。 – Paparazzi 2013-03-04 18:21:31

+0

OUTPUT似乎是我需要的,但是我怎樣才能輸出到臨時表中,新生成的ID與關聯的原始ID? – 2013-03-07 17:41:22

相關問題