62

別のテーブル 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 を使用しています。

4

8 に答える 8

166

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値が含まれます。

于 2008-09-19T09:14:42.550 に答える
5

質問を注意深く読むと、テーブル 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 のレコードを互いに区別できないため、まったく意味がありません。

于 2008-09-18T19:48:26.480 に答える
1

ID の代わりに uniqueidentifier 型を使用することをお勧めします。この場合、挿入前に ID を生成できます。

update B set NewID = NEWID()

insert into A(fname,lname,id) select fname,lname,NewID from B
于 2008-09-18T19:51:13.527 に答える
1

私が理解している限り、あなたが抱えている問題は、ID 列を持つテーブル A に INSERT を行い、そうでないテーブル 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
于 2008-09-18T19:32:35.740 に答える
0

常にこの動作が必要な場合は、テーブル B を更新する AFTER INSERT トリガーを TableA に置くことができます。

于 2008-09-18T19:26:27.813 に答える
0

行番号で結合することで取得できます。これが可能なのは、ID であるため、項目を追加すると増加するためです。これは、項目を選択した順序になります。

于 2008-09-18T19:29:02.970 に答える
-7

MBelly はその通りです。ただし、トリガーは、テーブル B が必要でなくても、常にテーブル B を更新しようとします (テーブル C からも挿入しているからですか?)。

ダレンもここで正しいです。結果セットとして複数の ID を取得することはできません。あなたのオプションは、カーソルを使用して挿入する各行の ID を取得するか、前後に ID を保存する Darren のアプローチを使用することです。ID の増分を知っている限り、テーブルが 3 つのイベントすべてに対してロックされていることを確認する限り、これは機能するはずです。

それが私であり、それがタイム クリティカルでない場合は、カーソルを使用します。

于 2008-09-18T19:52:48.890 に答える