web-dev-qa-db-ja.com

複数のレコードを挿入してID値を取得する方法は?

別のテーブルBからテーブルAに複数のレコードを挿入しています。テーブルAレコードのID値を取得し、カーソルを使用せずにテーブルbレコードを更新する方法はありますか?

Create Table A
(id int identity,
Fname nvarchar(50),
Lname nvarchar(50))

Create Table B
(Fname nvarchar(50),
Lname nvarchar(50),
NewId int)

Insert into A(fname, lname)
SELECT fname, lname
FROM B

MS SQL Server 2005を使用しています。

54
Dwight T

2005年からの出力句を使用します。

DECLARE @output TABLE (id int)

Insert into A (fname, lname)
OUTPUT inserted.ID INTO @output
SELECT fname, lname FROM B

select * from @output

これで、テーブル変数には、挿入するすべての行のID値が含まれます。

145
Andy Irving

質問を注意深く読んで、テーブルAの新しいID値に基づいてテーブルBを更新するだけです。

挿入が完了したら、更新を実行するだけです...

UPDATE B
SET NewID = A.ID
FROM B INNER JOIN A
     ON (B.FName = A.Fname AND B.LName = A.LName)

これは、FName/LNameの組み合わせを使用して、テーブル間のレコードをキー一致させることができると想定しています。そうでない場合は、レコードを正しく一致させるために、フィールドを追加する必要がある場合があります。

レコードを照合できる代替キーがない場合、テーブルBのレコードは互いに区別できないため、まったく意味がありません。

5
njr101

この動作が常に必要な場合は、TableBを更新するAFTER INSERTトリガーをTableAに配置できます。

0
Matt

行番号 に参加することで取得できます。これはIDであるため、アイテムを追加するたびに増加するため、アイテムを選択する順序で増加するため、可能です。

0
Darren Kopp

私が理解している限り、あなたが抱えている問題は、ID列のあるテーブルAに挿入したいのですが、テーブルBのIDを保持しないのです。

これを行うには、テーブルAでID挿入をオンにする必要があります。これにより、挿入時にIDを定義できるようになり、競合しない限り問題ありません。その後、あなたはちょうどすることができます:

Insert into A(identity, fname, lname) SELECT newid, fname, lname FROM B

使用しているDBが不明ですが、SQLサーバーの場合、ID挿入をオンにするコマンドは次のようになります。

set identity_insert A on
0
Cory

IDではなくuniqueidentifierタイプを使用することをお勧めします。この場合、挿入前にIDを生成できます。

update B set NewID = NEWID()

insert into A(fname,lname,id) select fname,lname,NewID from B
0
Dmitry Khalatov