12

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

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

4

7 に答える 7

32

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

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

魅力のように機能します。

于 2008-09-10T20:02:45.407 に答える
15

複数の行を挿入する場合、ステートメントでOUTPUTandINSERTED.columnname句を使用すると、すべての ID を一時テーブルに取得する簡単な方法になります。insert

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  
于 2008-09-10T20:51:40.453 に答える
3

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

于 2008-09-10T20:02:00.667 に答える
3

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();
于 2008-09-10T20:09:12.473 に答える
1

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

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

于 2008-09-10T19:58:31.733 に答える
1

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

dbo.tblName にトリガー tblName を作成し、Insert As を選択 new_id = @@IDENTITY

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

于 2008-09-10T21:08:38.180 に答える