Logo
Published on

How to: Using the OUTPUT Command in SQL to Write Revert and Rollback Statements

Generating Revert and Rollback SQL Statements with OUTPUT

Authors
  • avatar
    Name
    Mike Tsamis
    Twitter

In SQL, the OUTPUT clause can be a powerful tool when used correctly. One of its potential uses is to generate revert or rollback statements, which can be used to undo changes made by an UPDATE statement. This can be particularly useful in scenarios where you want to test changes without permanently altering your data.

Consider a scenario where you have a database with two tables: Orders and Customers. Each order in the Orders table has a CustomerID field that is a foreign key referencing the ID field in the Customers table. Now, suppose you want to update the CustomerID for multiple orders. This is a significant operation that could potentially disrupt your data integrity if not done correctly.

Let’s see how we can use the OUTPUT clause to generate a rollback statement for this operation:

UPDATE Orders 
SET CustomerID=789
OUTPUT CONCAT('UPDATE Orders SET CustomerID = ', deleted.CustomerID, ' WHERE OrderID = ', inserted.OrderID)
WHERE CustomerID = 123;

In this example, we’re updating the CustomerID field of all rows in the Orders table where the CustomerID is 123, setting the CustomerID to 789. The OUTPUT clause then generates a string that represents a SQL UPDATE statement that would set the CustomerID field back to its original value for each row that was just updated.

The inserted and deleted tables are special tables in SQL Server that hold the new version of the modified rows during UPDATE and DELETE statements (in the inserted table), and the old version of the modified rows (in the deleted table). In this case, inserted.OrderID refers to the OrderID of the newly updated row, and deleted.CustomerID refers to the original CustomerID before the update.

The output of this operation would be a series of SQL statements like this:

UPDATE Orders SET CustomerID = 123 WHERE OrderID = 1
UPDATE Orders SET CustomerID = 123 WHERE OrderID = 2
...

These are the rollback statements. You can execute these statements to undo the changes made by the original UPDATE statement.

However, it’s important to note that the OUTPUT clause just generates the rollback statements as strings - it doesn’t actually execute them. To execute the rollback statements, you would need to use a method appropriate for your SQL database.

Also, remember that the OUTPUT clause is not supported in all SQL databases. In SQL Server, the OUTPUT clause can be used to return information from, or expressions based on, each row affected by an INSERT, UPDATE, DELETE, or MERGE statement. If you’re using a different SQL database, you’ll need to look into that database’s specific syntax and capabilities for generating rollback statements.

Using the OUTPUT clause to generate rollback statements can be a powerful tool for testing and debugging, allowing you to make changes to your data with the peace of mind that you can easily undo those changes if necessary. However, as with any powerful tool, it’s important to use it responsibly and to thoroughly test your SQL statements to ensure they’re working as expected. Always backup your database before running UPDATE statements, especially if you’re updating a large number of rows. Happy coding!