INSERTステートメントのOUTPUT句を使用してID値を取得するにはどうすればよいですか?


240

次のような挿入ステートメントがある場合:

INSERT INTO MyTable
(  
  Name,
  Address,
  PhoneNo
)
VALUES
(
  'Yatrix',
   '1234 Address Stuff',
   '1112223333'
)

OUTPUT句を使用@var INTして新しい行のID値(と呼ばれるId)に設定するにはどうすればよいですか?たとえば、INSERTED.Nameをテーブル変数に入れるサンプルを見ましたが、それを非テーブル変数に入れることはできません。

私が試したOUPUT INSERTED.Id AS @varSET @var = INSERTED.Idしかし、どちらも働いていません。


3
@@ SCOPE_IDENTITYについてはすでに知っています。具体的には、OUPUTでそれを行う方法を知りたいです。ありがとう。
Yatrix

6
それをテーブル変数に挿入し、そこから選択する必要があります。OUTPUT節からスカラー変数に直接割り当てる構文はありません。
マーティン・スミス

3
OUTPUT句は、テーブルまたはテーブル変数に出力するように持って..
mellamokb

5
OUTPUT句は、テーブルに書き込みます。テーブル変数、一時テーブルなどを指定できます。
HABO

2
私の質問で、特にOUTPUT句を求めています。
Yatrix 2016

回答:


464

次のように、新しく挿入されたIDをSSMSコンソールに出力できます。

INSERT INTO MyTable(Name, Address, PhoneNo)
OUTPUT INSERTED.ID
VALUES ('Yatrix', '1234 Address Stuff', '1112223333')

これをC#などからも使用できます。IDを呼び出し元のアプリに戻す必要がある場合は、次のコマンドでSQLクエリを実行します。 .ExecuteScalar()(の代わりに.ExecuteNonQuery()ID返された結果を読み取ります。

または、新しく挿入されたものをキャプチャする必要がある場合 IDれたT-SQL(たとえば、後の処理のために)、テーブル変数を作成する必要があります。

DECLARE @OutputTbl TABLE (ID INT)

INSERT INTO MyTable(Name, Address, PhoneNo)
OUTPUT INSERTED.ID INTO @OutputTbl(ID)
VALUES ('Yatrix', '1234 Address Stuff', '1112223333')

このようにして、複数の値を入力し@OutputTbl、それらにさらに処理を行うことができます。ここでは、「通常の」一時テーブル(#temp)または「実際の」永続テーブルを「出力ターゲット」として使用することもできます。


2
ここでの背後にあるコードに対する答えは簡潔でした。ExecuteScalar()FTW
ジョージョンストン14

10
結果をaに挿入できます。real persistent tableこれは、同時にテーブルINSERT内の情報を取得できることを意味するため、非常に素晴らしいですTWO
gotqn 2015

7
上からプルするために@@ IDENTITYを使用しないでください。@@ IDENTITYが履歴テーブルから値を返し始めたと同時に、1つのテーブルに加えられた変更の履歴を記録し、新しいテーブルに挿入していたので、トリガーを操作する難しい方法を見つけてください。そこから陽気が続きます!marc_sのソリューションを使用してください。とりあえず、@ OutputTblメソッドを使用しましたが、他のオプションに興味をそそられます。
Eric Bishard 2016

4
OUTPUT INTOは非常に素晴らしいですが、「OUTPUT INTO句のターゲットテーブルを(主キー、外部キー)リレーションシップのどちらの側にも置くことはできません」。これは、トランザクションがロールバックされた場合でもOUTPUT句がデータを返す可能性があるためだと思いますが、関連するテーブルAとBに一度にデータを挿入するのが非常に面倒です。
Robert Calhoun

3
@EricBishard SCOPE_IDENTITY()はそのためにうまく機能します。
デレックディーン2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.