1. ホーム
  2. sql

[解決済み] SQL Serverです。2つのテーブルに同時に挿入することは可能ですか?

2022-04-23 06:33:08

質問

私のデータベースには、以下の3つのテーブルがあります。 Object_Table , Data_TableLink_Table . リンクテーブルには、オブジェクトレコードのIDとデータレコードのIDという2つのカラムがあるだけです。

からデータをコピーしたい。 DATA_TABLE に対応するレコードを挿入します。 Data_TableLink_Table を別の与えられたオブジェクトの ID で使用することができます。

I できる テーブル変数に選択し、各反復で2つの挿入を行うループによってこれを行う。

この方法が一番いいのでしょうか?

編集 : ループを避けたい理由は2つあります。1つは、私は怠け者なので、ループ/テンプ・テーブルを使うとコードが多くなり、コードが多くなるとミスをする場所が増えるということ、もう1つはパフォーマンスに対する懸念です。

一度の挿入ですべてのデータをコピーできますが、各レコードが新しいIDを持つ新しいデータレコードにリンクするために、リンクテーブルをどのように取得しますか?

解決方法は?

以下は、私が持っていた状況を、テーブル変数を用いて設定したものです。

DECLARE @Object_Table TABLE
(
    Id INT NOT NULL PRIMARY KEY
)

DECLARE @Link_Table TABLE
(
    ObjectId INT NOT NULL,
    DataId INT NOT NULL
)

DECLARE @Data_Table TABLE
(
    Id INT NOT NULL Identity(1,1),
    Data VARCHAR(50) NOT NULL
)

-- create two objects '1' and '2'
INSERT INTO @Object_Table (Id) VALUES (1)
INSERT INTO @Object_Table (Id) VALUES (2)

-- create some data
INSERT INTO @Data_Table (Data) VALUES ('Data One')
INSERT INTO @Data_Table (Data) VALUES ('Data Two')

-- link all data to first object
INSERT INTO @Link_Table (ObjectId, DataId)
SELECT Objects.Id, Data.Id
FROM @Object_Table AS Objects, @Data_Table AS Data
WHERE Objects.Id = 1

おかげさまで 回答 OUTPUT句を指摘してくれたので、解決策を示すことができます。

-- now I want to copy the data from from object 1 to object 2 without looping
INSERT INTO @Data_Table (Data)
OUTPUT 2, INSERTED.Id INTO @Link_Table (ObjectId, DataId)
SELECT Data.Data
FROM @Data_Table AS Data INNER JOIN @Link_Table AS Link ON Data.Id = Link.DataId
                INNER JOIN @Object_Table AS Objects ON Link.ObjectId = Objects.Id 
WHERE Objects.Id = 1

しかし、次のようなエラーが発生するため、現実にはそれほど単純ではないことがわかりました。

OUTPUT INTO 句は、以下のような場合には使用できません。 のどちらか一方が(主キー、外部キー キー)の関係

私はまだ OUTPUT INTO を作成し、その後、通常の挿入で終了します。そのため、ループを回避することはできますが、テンポラリテーブルを回避することはできません。