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_AssociationA和复制记录tbl_AssociationB,因为我不想对修改进行进一步Object X修改Object 12

tbl_AssociationA所以,要在and中创建新记录tbl_AssociationB,我会使用这个:

INSERT INTO tbl_AssociationA
SELECT @NewId,Description FROM tbl_AssociationA WHERE ObjectID=@NewId;

INSERT INTO tbl_AssociationB
SELECT @NewId,LabelText FROM tbl_AssociationB WHERE ObjectID=@NewId;

如何插入tbl_RelationAB使用那些新创建的记录。请注意,和中的列ID是。tbl_AssociationAtbl_AssociationBIDENTITY

4

2 回答 2

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 

但我知道这不是您问题的完整答案。
我认为您将需要输出到临时表。
一旦你得到更好的答案,我会删除这个。

于 2013-03-04T17:12:21.703 回答
2

好的,所以交易是:

我想将 Object X 复制到 Object Z。 Object X 被引用tbl_AssociationAtblAssociationB带有外键ObjectID。第三个表 ,指定和tbl_RelationAB之间的多对多映射。tbl_AssociationA.IDtbl_AssociationB.ID

在此解决方案中,对象 X 被引用,@originalObjectID对象 Z被引用@copiedObjectID。2 个临时表@TempA@TempB用于保持 和 的新旧自动生成IDtbl_AssociationA之间的映射tbl_AssociationB

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 ObjectID=@originalObjectID
) 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 ObjectID=@originalObjectID
) 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;

所以 table也会被复制新的自动生成的和tbl_RelationAB之间的关系。希望这可以帮助将来的人!tbl_AssociationA.IDtbl_AssociationB.ID

于 2013-03-07T18:55:47.613 回答