SQL Server 2005 では、"Is Identity" プロパティが "Yes" に設定されたテーブルに "id" フィールドがあります。したがって、そのテーブルで Insert が実行されると、「id」は次の増分整数に自動的に設定されます。Insert の直後に Select ステートメントを実行しなくても、Insert が実行されて「id」が設定されたものを取得する簡単な方法はありますか?
の複製:
挿入された行のIDを取得する最良の方法?
SQL Server 2005 では、"Is Identity" プロパティが "Yes" に設定されたテーブルに "id" フィールドがあります。したがって、そのテーブルで Insert が実行されると、「id」は次の増分整数に自動的に設定されます。Insert の直後に Select ステートメントを実行しなくても、Insert が実行されて「id」が設定されたものを取得する簡単な方法はありますか?
の複製:
挿入された行のIDを取得する最良の方法?
少なくとも .Net では、一度に複数のクエリをサーバーに送信できます。私は自分のアプリでこれを行います:
command.CommandText = "INSERT INTO [Employee] (Name) VALUES (@Name); SELECT SCOPE_IDENTITY()";
int id = (int)command.ExecuteScalar();
魅力のように機能します。
複数の行を挿入する場合、ステートメントでOUTPUT
andINSERTED.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
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 ステートメントを書き出すことを心配する必要がなくなります。私は次のように見えます:
dbo.tblName にトリガー tblName を作成し、Insert As を選択 new_id = @@IDENTITY
次に、コード内から、insert ステートメントを select ステートメントのように扱います。実行して結果を評価するだけです。「newID」列には、作成したばかりの行の ID が含まれます。