SQLServerでレコード更新内容を参照する

SQLServer

レコードの追加・更新・削除の内容をTransact-SQLで参照する方法を紹介します。

コーディング例

BEGIN
  -- テーブルの準備
  CREATE TABLE #WORK(
     [ID]   INT IDENTITY(1,1) NOT NULL PRIMARY KEY
    ,[NAME] NVARCHAR(10)      NOT NULL
  )
  INSERT INTO #WORK
  VALUES 
     ('やまだ')
    ,('さとう')
    ,('たなか')
  ;

  -- 更新結果テーブル作成
  CREATE TABLE #RESULT(
     [SEQ]         INT IDENTITY(1,1)
    ,[ACTION]      NCHAR(3)
    ,[BEFORE_ID]   INT
    ,[BEFORE_NAME] NVARCHAR(10)
    ,[AFTER_ID]    INT
    ,[AFTER_NAME]  NVARCHAR(10)
  );

  -- データ追加
  INSERT INTO #WORK
  OUTPUT
    'INS'
    ,INSERTED.*
  INTO
    #RESULT(
       [ACTION]
      ,[AFTER_ID]
      ,[AFTER_NAME]
    )
  VALUES
     ('やまもと')
    ,('なかた');
  ;

  -- データ更新
  UPDATE #WORK
    SET [NAME] = '山田'
  OUTPUT
     'UPD'
    ,DELETED.*
    ,INSERTED.*
  INTO
    #RESULT(
       [ACTION]
      ,[BEFORE_ID]
      ,[BEFORE_NAME]
      ,[AFTER_ID]
      ,[AFTER_NAME]
    )
  WHERE
    [NAME] = 'やまだ'
  ;

  -- データ削除
  DELETE FROM #WORK
  OUTPUT
     'DEL'
    ,DELETED.*
  INTO
    #RESULT(
       [ACTION]
      ,[BEFORE_ID]
      ,[BEFORE_NAME]
    )
  WHERE
    [NAME] = 'さとう'
  ;

  -- 更新結果
  SELECT * FROM #RESULT;

  -- 後片付け
  DROP TABLE #WORK;
  DROP TABLE #RESULT;
END

実行結果

SEQ ACTION BEFORE_ID BEFORE_NAME AFTER_ID AFTER_NAME
1 INS NULL NULL 4 やまもと
2 INS NULL NULL 5 なかた
3 UPD 1 やまだ 1 山田
4 DEL 2 さとう NULL NULL

更新中のデータをOUTPUT句で出力し、INTO句でそのデータをテーブルへ追加することができます。
INSERTEDテーブルとDELETEDテーブルはトリガーで使用するものと同じで、INSERT文の場合はINSERTEDテーブルに追加したレコードが格納されます。
UPDATE文の場合はDELETEDテーブルに更新前のレコード、INSERTEDテーブルに更新後のレコードが格納されます。
DELETE文の場合はDELETEDテーブルに削除前のレコードが格納されます。
以上、「SQLServerでレコード更新内容を参照する」の紹介でした。

 

株式会社システムトラスト

人材募集中です。

システムトラストでは、システムエンジニア、プログラマーなどを随時募集中です。気軽にご相談ください。

お問合せ