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でレコード更新内容を参照する」の紹介でした。