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_AssociationBObject XObject 12

tbl_AssociationAしたがって、とで新しいレコードを作成するには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_AssociationAあるtbl_AssociationBことに注意してくださいIDENTITY

4

2 に答える 2

2

わかりましたので、取引は次のとおりです。

オブジェクト X をオブジェクト Z にコピーしたいと考えています。オブジェクト X は外部キー で参照さtbl_AssociationAれています。3 番目のテーブル は、との間の多対多マッピングを指定します。tblAssociationBObjectIDtbl_RelationABtbl_AssociationA.IDtbl_AssociationB.ID

このソリューションでは、オブジェクト X は で参照され@originalObjectID、オブジェクト Zは で参照され@copiedObjectIDます。2 つの一時テーブル@TempAとは、 と の古い自動生成列と@TempB新しい自動生成ID列の間のマッピングを保持するために使用されます。tbl_AssociationAtbl_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;

そのため、新しい自動生成されたとtbl_RelationABの間の関係もテーブルにコピーされます。これが将来誰かを助けることを願っています!tbl_AssociationA.IDtbl_AssociationB.ID

于 2013-03-07T18:55:47.613 に答える
2

同じテーブルを再利用していますが、挿入はありません。
しかし、これは 2 つの IDEN を取得してステートメントで使用する方法を示しています。

  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 に答える