SQL Serverでは、Insert実行時にレコードの「id」を取得することはできますか?
-
09-06-2019 - |
質問
SQL Server 2005 では、「Is Identity」プロパティが「Yes」に設定されているテーブルに「id」フィールドがあります。したがって、そのテーブルで Insert が実行されると、「id」は次に増加する整数に自動的に設定されます。Insert が実行されたときに、Insert の直後に Select ステートメントを実行せずに、「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は挿入ステートメントの後にアイデンティティ列の値を返します