2008-09-10 1 views
12

SQL Server 2005では、「ID」プロパティが「はい」に設定されているテーブルに「id」フィールドがあります。したがって、そのテーブルでInsertが実行されると、「id」は自動的に次の増分整数に設定されます。 Insertの直後にSelectステートメントを実行しなくても、 "id"がどのように設定されているかを取得するためにInsertが実行されると、簡単な方法がありますか?SQL Serverでは、Insertが実行されたときにレコードの「ID」を取得できますか?

の重複:あなたはSCOPE_IDENTITY()関数を選択する必要が
Best way to get identity of inserted row?

答えて

32

少なくとも、あなたは一度にサーバに複数のクエリを送信することができます。私は私のアプリでこれを行う:

command.CommandText = "INSERT INTO [Employee] (Name) VALUES (@Name); SELECT SCOPE_IDENTITY()"; 
int id = (int)command.ExecuteScalar(); 

魅力のように動作します。

+3

このソリューションは良いです。良い一括更新のソリューションについては、kamajoの答えを参照してください。 – CodeWarrior

+1

MySQLでそれを行う方法を探している人には、SCOPE_IDENTITYをLAST_INSERT_IDに置き換えてください。 MySqlCommandでLastInsertedIdパラメーターを使用するだけです。 –

+0

ExecuteScalar()の戻り値をintに直接キャストする際にエラーが発生します。私はそれを小数にキャストするときに問題なく動作します。 –

1

これをアプリケーションコードから実行するには、通常、このプロセスをストアドプロシージャにカプセル化して、アプリケーションに対して1つのクエリのように見えます。

2

SCOPE_IDENTITY();あなたの最善の策です。また、.NETを使用している場合は、パラメータを渡して、プロシージャの実行後に値を確認してください。

CREATE PROCEDURE [dbo].[InsertProducts] 
    @id    INT    = NULL OUT, 
    @name   VARCHAR(150) = NULL, 
    @desc   VARCHAR(250) = NULL 

AS 

    INSERT INTO dbo.Products 
     (Name, 
     Description) 
    VALUES 
     (@name, 
     @desc) 

    SET @id = SCOPE_IDENTITY(); 
14

あなたが複数の行を挿入している場合、insertステートメントのOUTPUTINSERTED.columnname句の使用は、一時テーブルにすべてのIDを取得するための簡単な方法です。

DECLARE @MyTableVar table(ID int, 
           Name varchar(50), 
           ModifiedDate datetime); 
INSERT MyTable 
     OUTPUT INSERTED.ID, INSERTED.Name, INSERTED.ModifiedDate INTO @MyTableVar 
SELECT someName, GetDate() from SomeTable 
+0

私はこれが好きです!先端に感謝します。 – CodeWarrior

+0

これはバージョン固有のものなのかどうかはわかりません(今は2012年ですが、SQL 10.0.1600を使用しています)が、一時テーブルを経由する必要はありません。私はまた、GUIDフィールドでもPKのように使用されている場合、これがうまくいくのを好んでいます...私はそれほど多くのことを主張しているわけではありませんが、うまくいきます。 –

1

私は、エンタープライズマネージャーを使用してテーブルにトリガーを付けることをお勧めします。そのようにして、コード内に余分なSQL文を書くことを心配する必要はありません。鉱山は、このような何かを見て:

を選択すると挿入 についてdbo.tblName でトリガtblName を作成NEW_ID = @@ IDENTITY

はその後、あなたのコード内から、選択statements-のようなあなたのINSERT文を扱うだけ結果を実行し、評価する。 「newID」列には、作成したばかりの行のIDが入ります。唯一の単一の行の更新を扱うとき

これはおそらく、SQL Serverの私が見つけた最高の実用的なソリューションである
関連する問題