insert … selectによって挿入された行の識別情報を取得する方法

identity sql sql-server

これと同じようなクエリを通してレコードを挿入しています。

tbl_abcからfield1を選択してtbl_xyzに挿入

今度は、挿入されたレコードの新しく生成されたIDENTITY値を取得します。 最小量のロックと最大の信頼性でこれを行うにはどうすればよいですか?

  4  6


ベストアンサー

この情報は OUTPUT句を使用して取得できます。

情報を一時ターゲット表またはビューに出力できます。

これが一例です。

DECLARE @InsertedIDs TABLE(ID bigint)DestTableへの挿入(col1、col2、col3、col4)OUTPUT INSERTED.ID INTO @InsertedIDs SELECT col1、col2、col3、col4 FROM SourceTable

その後、挿入したIDについてテーブルInsertedIDsを照会できます。

19


@@ IDENTITYは最後に挿入されたIDENTITY値を返すので、考えられる問題は2つあります。

  1. table_xyzへの挿入時に実行されるトリガには注意してください。これは@@ IDENTITYの値を変更する可能性があります。

  2. tbl_abcに複数の行がありますか。 もしそうなら@@ IDENTITYは最後の行のアイデンティティ値だけを返すでしょう

問題1は、@@ IDENTITYの代わりにSCOPE__IDENTITY()を使用して解決できます。問題2は解決が困難です。 tbl_abcのfield1は、ID列を使用してtable_xyzからデータを再選択できる場合、tbl_xyz内で固有のレコードを定義しますか。 CURSORSを使用した他の解決策がありますが、これらは遅いでしょう。

2


SELECT @@ IDENTITY

これが私が以前にやったことです。 これがあなたの記事の後半に会うかどうか確かではない。

*編集*このリンクも見つかりましたが、同じかどうかはわかりませんが…​ 複数のレコードを挿入してIDの値を取得する方法を教えてください。

1


私の知る限りでは、同じスクリプト内で直接SQLを使ってこれを行うことはできません。 しかし、あなたはINSERTトリガを作成することができます。 今、私は*トリガー*が嫌い*ですが、それはそれを行う一つの方法です。

何をしようとしているかに応じて、最初に一時テーブルまたはテーブル変数に行を挿入し、結果セットをそのように処理することをお勧めします。 うまく行けば、あなたがリンクできるユニークなコラムがあります。

テーブルをロックして最大キーを取得し、行を挿入してから再び最大キーを取得して範囲を指定することもできます。

引き金:

 - 挿入テーブルを使用します。 これは挿入されたすべての行を保持します。 SELECT * FROM挿入済み

温度表:

tbl_abcから#tempにfield1、unique_colを挿入します。

tbl_abzからfield1、unique_colを選択し、tbl_xyz(field1、unique_col)に挿入します。

 - これは更新、カーソル、またはあなたがしたいことなら何でも可能です。SELECT * FROM tbl_xyz WHERE EXISTS(SELECT top 1 unique_col FROM #temp WHERE unique_col = tbl_xyz.unique_col)

キー範囲:

intとして@minkeyを、intとして@maxkeyを宣言する

BEGIN TRANS  - これを機能させるにはテーブルをロックする必要があります

--keyはID列の名前です。SELECT @minkey = MAX(key)FROM tbl_xyzに挿入tbl_abcからfield1を選択SELECT @maxkey = MAX(key)FROM tbl_xyz

コミットトランス

@minkeyと@maxkeyの間のtbl_xyzのどこからキーを選択する*

1


タイトルとURLをコピーしました