別のテーブル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を使用しています。
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値が含まれます。
質問を注意深く読んで、テーブル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のレコードは互いに区別できないため、まったく意味がありません。
この動作が常に必要な場合は、TableBを更新するAFTER INSERTトリガーをTableAに配置できます。
行番号 に参加することで取得できます。これはIDであるため、アイテムを追加するたびに増加するため、アイテムを選択する順序で増加するため、可能です。
私が理解している限り、あなたが抱えている問題は、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
IDではなくuniqueidentifierタイプを使用することをお勧めします。この場合、挿入前にIDを生成できます。
update B set NewID = NEWID()
insert into A(fname,lname,id) select fname,lname,NewID from B