2013-03-04 74 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

相关问题