SQL Serverでは、Insert実行時にレコードの「id」を取得することはできますか?

StackOverflow https://stackoverflow.com/questions/55159

  •  09-06-2019
  •  | 
  •  

質問

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

の重複:
挿入された行の ID を取得する最良の方法は?

役に立ちましたか?

解決

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

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

まるで魔法のように機能します。

他のヒント

複数の行を挿入する場合、 OUTPUT そして INSERTED.columnname に関する条項 insert ステートメントは、すべての 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  

Scope_identity() が推奨される方法です。以下を参照してください。 現在の ID 値を取得する 6 つの方法

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();

scope_identity() 関数を選択する必要があります。

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

私は、エンタープライズ マネージャーを使用してテーブルにトリガーをアタッチすることを好む傾向があります。そうすれば、コード内に余分な SQL ステートメントを書き出すことを心配する必要がなくなります。私の場合は次のようになります。

select new_id = @@ itedとして挿入のdbo.tblnameでtblnameを作成する

次に、コード内から挿入ステートメントを選択ステートメントのように扱います。実行して結果を評価するだけです。「newID」列には、作成したばかりの行の ID が含まれます。

これはおそらく、私が見つけた SQL Server 用の最良の解決策です。SQL Serverは挿入ステートメントの後にアイデンティティ列の値を返します

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top