INSERTステートメントの後にKey-Valueを取り戻そうとしています。例:nameとidという属性を持つテーブルがあります。 idは生成された値です。
INSERT INTO table (name) VALUES('bob');
今、私は同じステップでIDを取り戻したいです。これはどのように行われますか?
Microsoft SQL Server 2008を使用しています。
別のSELECTは必要ありません...
INSERT INTO table (name)
OUTPUT Inserted.ID
VALUES('bob');
これは非IDENTITY列(GUIDなど)でも機能します。
新しいID値を取得するにはSCOPE_IDENTITY()
を使います
INSERT INTO table (name) VALUES('bob');
SELECT SCOPE_IDENTITY()
INSERT INTO files (title) VALUES ('whatever');
SELECT * FROM files WHERE id = SCOPE_IDENTITY();
トリガー付きのテーブルでOUTPUT句の競合が発生するという既知の問題があるため、最も安全な方法です。たとえあなたのテーブルが現在トリガを持っていないとしても、これは非常に信頼できないものになります - 誰かがあなたのアプリケーションを壊すでしょう。時限爆弾のような行動。
より詳しい説明はmsdnの記事を見てください。
Entity Frameworkは、gbnの答えに似た動作をします。
DECLARE @generated_keys table([Id] uniqueidentifier)
INSERT INTO Customers(FirstName)
OUTPUT inserted.CustomerID INTO @generated_keys
VALUES('bob');
SELECT t.[CustomerID]
FROM @generated_keys AS g
JOIN dbo.Customers AS t
ON g.Id = t.CustomerID
WHERE @@ROWCOUNT > 0
出力結果は一時テーブル変数に格納され、その後クライアントに選択されます。落とし穴に注意する必要があります。
挿入は複数の行を生成する可能性があるため、変数は複数の行を保持できるため、複数の
ID
を返すことができます
EFが一時テーブルを実際のテーブルに内部結合する理由はわかりません(どのような状況で2つが一致しない場合があります)。
しかしそれがEFのやり方です。
SQL Server 2008以降のみ。それが2005年であれば、あなたは運が悪いです。
@@ IDENTITY最後に挿入されたID値を返すシステム関数です。
Scope_identityを使用して、変数に挿入したばかりの行のIDを選択してから、そのテーブルから必要な列をすべて選択することができます。id = scope_identityから取得したIDです。
MSDNの情報についてはこちらを参照してください http://msdn.Microsoft.com/ja-jp/library/ms190315.aspx
最も確実で確実な解決策はSCOPE_IDENTITYを使用することです。同じスコープ内で2つのinsertを呼び出すことができるので、挿入するたびにスコープのIDを取得して変数に保存する必要があります。 @identityと@@ identityは機能するかもしれませんが、安全な範囲ではありません。大きなアプリケーションで問題が発生する可能性があります
declare @duplicataId int
select @duplicataId = (SELECT SCOPE_IDENTITY())
詳細はこちら マイクロソフトのドキュメント
あなたはあなたのinsertステートメントにselectステートメントを追加することができます。整数myInt = table1(FName)の値に挿入( 'Fred'); Scope_Identity()を選択します。これはscalerが実行されたときにidentityの値を返します。
これは、SQL ServerでID列としてIDを使用するテーブルに挿入するときにOUTPUT INSERTEDを使用する方法です。
'myConn is the ADO connection, RS a recordset and ID an integer
Set RS=myConn.Execute("INSERT INTO M2_VOTELIST(PRODUCER_ID,TITLE,TIMEU) OUTPUT INSERTED.ID VALUES ('Gator','Test',GETDATE())")
ID=RS(0)