SQL Server - INSERT後に値を取得する - ストアドプロシージャ

2024-04-02

SQL ServerでINSERTを実行した後、挿入されたレコードの値を取得したい場合があります。この場合、いくつかの方法があります。

方法

@@IDENTITY

IDENTITYプロパティを持つ列に値を挿入する場合、@@IDENTITY変数を使用して、挿入されたレコードのIDを取得できます。

INSERT INTO dbo.MyTable (Name) VALUES ('Test');

SELECT @@IDENTITY;

OUTPUT句を使用して、挿入されたレコードの値を直接取得できます。

INSERT INTO dbo.MyTable (Name) OUTPUT INSERTED.ID VALUES ('Test');

DECLARE @ID INT;

SET @ID = (SELECT ID FROM INSERTED);

SELECT @ID;
DECLARE @ID INT;

INSERT INTO dbo.MyTable (Name) VALUES ('Test') RETURNING INTO @ID;

SELECT @ID;
INSERT INTO dbo.MyTable (Name) VALUES ('Test');

SELECT ID, Name FROM dbo.MyTable WHERE Name = 'Test';

方法の比較

方法利点欠点
@@IDENTITYシンプルIDENTITYプロパティを持つ列にしか使用できない
OUTPUT句柔軟性が高い古いバージョンのSQL Serverでは使用できない
RETURNING INTO変数に直接格納できる古いバージョンのSQL Serverでは使用できない
SELECT汎用性が高い他の方法より複雑

注意事項

  • 複数の行を挿入する場合、@@IDENTITYOUTPUT句、RETURNING INTOは最初の行の値のみ取得します。
  • トランザクション内でINSERTを実行している場合、@@IDENTITYOUTPUT句、RETURNING INTOはコミットされるまで値を取得できません。

上記以外にも、トリガーやストアドプロシージャを使用して、INSERT後に値を取得する方法があります。




-- @@IDENTITY

CREATE TABLE dbo.MyTable (
  ID INT IDENTITY(1, 1),
  Name VARCHAR(50)
);

INSERT INTO dbo.MyTable (Name) VALUES ('Test');

SELECT @@IDENTITY;

-- OUTPUT句

CREATE TABLE dbo.MyTable (
  ID INT IDENTITY(1, 1),
  Name VARCHAR(50)
);

INSERT INTO dbo.MyTable (Name) OUTPUT INSERTED.ID VALUES ('Test');

DECLARE @ID INT;

SET @ID = (SELECT ID FROM INSERTED);

SELECT @ID;

-- RETURNING INTO

CREATE TABLE dbo.MyTable (
  ID INT IDENTITY(1, 1),
  Name VARCHAR(50)
);

DECLARE @ID INT;

INSERT INTO dbo.MyTable (Name) VALUES ('Test') RETURNING INTO @ID;

SELECT @ID;

-- SELECT

CREATE TABLE dbo.MyTable (
  ID INT IDENTITY(1, 1),
  Name VARCHAR(50)
);

INSERT INTO dbo.MyTable (Name) VALUES ('Test');

SELECT ID, Name FROM dbo.MyTable WHERE Name = 'Test';

上記のサンプルコードは、@@IDENTITYOUTPUT句、RETURNING INTOSELECTを使用して、INSERT後に値を取得する方法を示しています。

実行方法

  1. SQL Server Management Studio (SSMS) を起動します。
  2. 新しいクエリウィンドウを開きます。
  3. サンプルコードをクエリウィンドウに貼り付けます。
  4. F5キーを押してクエリを実行します。

結果

@@IDENTITYOUTPUT句、RETURNING INTOSELECTはいずれも、挿入されたレコードのIDを取得します。




トリガー

CREATE TRIGGER dbo.MyTable_Insert ON dbo.MyTable
AFTER INSERT
AS
BEGIN
  SELECT ID, Name FROM INSERTED;
END;

ストアドプロシージャを使用して、INSERTを実行し、挿入されたレコードの値を取得できます。

CREATE PROCEDURE dbo.MyTable_Insert
  @Name VARCHAR(50)
AS
BEGIN
  INSERT INTO dbo.MyTable (Name) VALUES (@Name);

  SELECT ID, Name FROM dbo.MyTable WHERE Name = @Name;
END;

これらの方法は、より複雑な処理が必要な場合に有効です。

  • トリガーやストアドプロシージャを使用する場合は、パフォーマンスに注意する必要があります。
  • トランザクション内でINSERTを実行している場合、トリガーやストアドプロシージャはコミットされるまで値を取得できません。

sql sql-server sql-server-2008


1行だけ残したい!MySQLで重複行をサクッと削除する方法

MySQLで重複行をすべて削除し、1行のみ残したい場合は、いくつかの方法があります。方法1: DISTINCT キーワードを使用するこの方法は、重複する行をグループ化し、各グループから1行のみを選択します。方法2: GROUP BY と HAVING 句を使用する...


SQL ServerでUPDATEステートメントとALTER TABLEステートメントを組み合わせてNOT NULL制約を変更する方法

SQL Serverでは、ALTER TABLE ステートメントを使用して、既存のテーブル列のデータ型や制約を変更することができます。この中には、列の NOT NULL 制約を NULL に変更することも含まれます。手順以下の手順に従って、SQL Serverで列の NOT NULL 制約を NULL に変更することができます。...


SQL Server 2005 で VARCHAR(MAX) を出力するその他の方法:上級者向けガイド

PRINT ステートメントを使用して VARCHAR(MAX) データ型を出力するには、以下の構文を使用します。ここで、@variable_name は VARCHAR(MAX) データ型の変数名です。例:このコードは、my_variable 変数に格納されている VARCHAR(MAX) データ型を出力します。...


【初心者向け】MySQL/SQL で VARCHAR フィールドの文字列出現回数を簡単にカウントする

COUNT() 関数は、指定された条件に一致するレコードの数を数えます。文字列出現回数を数えるには、次のようなクエリを使用できます。このクエリでは、your_table テーブルの your_column 列内のすべての値が %your_string% パターンに一致するレコードの数を count という名前のエイリアス付きでカウントします。...


【初心者向け】SQL Server で DATETIME フィールドを日付のみで取得する3つの方法とは?

CONVERT 関数は、あるデータ型を別のデータ型に変換するために使用されます。DATETIME フィールドを日付型に変換するには、次のように CONVERT 関数を使用します。利点:シンプルで分かりやすい構文他の方法と比べて高速な場合がある...


SQL SQL SQL SQL Amazon で見る



SCOPE_IDENTITY() を使用して挿入された行の ID を取得する方法

SQL Server で INSERT ステートメントを使用して行を挿入した後、その行の ID を取得する必要がある場合があります。この ID は、多くの場合、主キーとして使用されます。方法挿入された行の ID を取得するには、次の 3 つの方法があります。


パフォーマンス向上!SQL ServerでSET NOCOUNT ONを使いこなす

SET NOCOUNT ON は、Transact-SQL (T-SQL) ステートメントやストアドプロシージャの実行後に、影響を受けた行数を示すメッセージの送信を抑制します。これは、ネットワークトラフィックを削減し、パフォーマンスを向上させるために役立ちます。