SQL Server 2005 introduced the OUTPUT clause which has the ability to access the INSERTED and DELETED tables during DML actions. The OUTPUT clause can be added to your T-SQL scripts to write modified row data out to a table or return data back to the client.
The OUTPUT clause can be used for auditing and archiving modified rows. In this tutorial, I’ll walk through a few uses of the OUTPUT clause with different DML statements and examples. Copy and Paste the T-SQL below into SSMS.
USE tempdb
GO
IF OBJECT_ID('sampletbl', 'U') IS NOT NULL
DROP TABLE dbo.sampletbl;
IF OBJECT_ID('sampletbl_audit', 'U') IS NOT NULL
DROP TABLE dbo.sampletbl_audit;
GO
CREATE TABLE dbo.sampletbl (
ID INT IDENTITY(26, 1) PRIMARY KEY
,firstname VARCHAR(100)
,lastname VARCHAR(100)
)
GO
CREATE TABLE dbo.sampletbl_audit (
ID INT IDENTITY(1, 1) PRIMARY KEY
,fk INT
,WhatHappened VARCHAR(255)
,dt DATETIME
)
GO
DECLARE @IDs TABLE (ID INT)
/*INSERT the IDs of a records that were inserted into TV @IDs */
INSERT INTO dbo.sampletbl ( firstname, lastname )
OUTPUT INSERTed.ID
INTO @IDs
VALUES( 'Jim','Bob'),( 'Billy','Bob')
, ( 'Billy','Ray'),( 'Bubba','Bryar');
SELECT * FROM dbo.sampletbl;
SELECT * FROM @ids;
/*update record, display OUTPUT results */
SELECT * FROM dbo.sampletbl WHERE id = 28;
UPDATE dbo.sampletbl
SET firstname = 'Charles'
OUTPUT deleted.firstname [DELETED_firstname]
,inserted.firstname [INSERTED_firstname]
WHERE id = 28;
SELECT * FROM dbo.sampletbl WHERE id = 28;
/*INSERT OUTPUT results to audit table */
UPDATE dbo.sampletbl
SET firstname = 'Chuck'
OUTPUT inserted.ID
,'Name Change: ' + deleted.firstname
+ ' -> ' + inserted.firstname
,getdate()
INTO dbo.sampletbl_audit
WHERE id = 28;
SELECT *
FROM dbo.sampletbl_audit