It is common to have to execute a mass update on some table, for example, to update a customer credit classification. When such updates are executed, you may want to know what has changed and maybe log it. There are several ways to do it, but i recently found one that makes it easier: the OUTPUT clause.
First, we create a customer table for the example and populate it with some data:
IF OBJECT_ID('Customers') IS NOT NULL
DROP TABLE Customers
GO
CREATE TABLE Customers (
CustomerId INT,
[Name] VARCHAR(30),
Income MONEY,
Classification CHAR(1)
)
INSERT INTO Customers (CustomerId, [Name], Income, Classification) VALUES (1, 'JOHN DOE', 5000, 'C')
INSERT INTO Customers (CustomerId, [Name], Income, Classification) VALUES (1, 'JANE DOE', 6000, 'B')
INSERT INTO Customers (CustomerId, [Name], Income, Classification) VALUES (1, 'JOHN SMITH', 6500, 'B')
INSERT INTO Customers (CustomerId, [Name], Income, Classification) VALUES (1, 'HOMELESS JOHN', 100, 'Z')
Now, let's update the data (imagine that there are thousands of rows):
UPDATE Customers
SET Classification = 'C'
OUTPUT DELETED.CustomerId,
DELETED.[Name],
DELETED.Classification AS FromClassification,
INSERTED.Classification AS ToClassification
WHERE Income BETWEEN 5000 AND 7000
The OUTPUT part will cause the following output:
CustomerId Name FromClassification ToClassification ----------- ------------------------------ ------------------ ---------------- 1 JOHN DOE C C 1 JANE DOE B C 1 JOHN SMITH B C
If you want to persist the values:
IF OBJECT_ID('CreditChangeLog') IS NOT NULL
DROP TABLE CreditChangeLog
GO
CREATE TABLE CreditChangeLog (
CustomerId INT,
FromClassification CHAR(1),
ToClassification CHAR(1)
)
UPDATE Customers
SET Classification = 'C'
OUTPUT DELETED.CustomerId,
DELETED.Classification AS FromClassification,
INSERTED.Classification AS ToClassification
INTO CreditChangeLog
WHERE Income BETWEEN 5000 AND 7000
SELECT * FROM CreditChangeLog
This will save the changed values on the CreditChangeLog table.
No comments:
Post a Comment