Introduction
Most SQL Server users think that a trigger is the only place where we can use DELETED and INSERTED virtual tables to capture data change in result of any INSERT, UPDATE or DELETE statement.
Old and new data values affected by DML operations can be captured by using
OUTPUT clause along with virtual DELETED and INSERTED tables. Here are
few examples which will be helpful to understand usage of this OUTPUT
clause in simple insert, update and delete queries.
Update
USE AdventureWorks
GO
DECLARE @UpdatedRecords TABLE
(AddressID INT, OldAddressLine2 VARCHAR(50), NewAddressLine2 VARCHAR(50))
UPDATE Person.Address
SET AddressLine2 = 'Silver Street new'
OUTPUT DELETED.AddressID, DELETED.AddressLine2,INSERTED.AddressLine2
INTO @UpdatedRecords
WHERE AddressID = 3
SELECT * FROM @UpdatedRecords
Delete
USE AdventureWorks
GO
DECLARE @DeletedRecords TABLE
(AddressID INT, AddressLine1 VARCHAR(50), AddressLine2 VARCHAR(50)
,City VARCHAR(50),StateProvinceID INT,PostalCode VARCHAR(10)
,rowguid UNIQUEIDENTIFIER,ModifiedDate DATETIME)
DELETE FROM Person.Address
OUTPUT DELETED.*
INTO @DeletedRecords
WHERE AddressID = 3
SELECT * FROM @DeletedRecords
Insert
USE AdventureWorks
GO
DECLARE @InsertedRecords TABLE
(AddressID INT, AddressLine1 VARCHAR(50), AddressLine2 VARCHAR(50)
,City VARCHAR(50),StateProvinceID INT,PostalCode VARCHAR(10)
,rowguid UNIQUEIDENTIFIER,ModifiedDate DATETIME)
INSERT INTO Person.Address
(AddressLine1 , AddressLine2 ,City ,StateProvinceID ,PostalCode
,rowguid ModifiedDate)
OUTPUT INSERTED.*
INTO @InsertedRecords
VALUES ('3rd BlackStone rd','wst.51','Bothell',78,98010,NEWID(),GETDATE()
SELECT * FROM @InsertedRecords
Note: This method is applicable for SQL Server 2005 and above versions.