• If, for some reason, you wanted to keep track of work regardless of the transaction state, you could use a table variable instead.

    Table variables exist outside the scope of the transaction, and therefore are not rolled back.

    For example:

    DECLARE @CategoryChanges TABLE

    ( ChangeID int Primary Key Identity

    , CategoryID int

    , OldCategoryName nvarchar(15)

    , NewCategoryName nvarchar(15)

    , ModifiedDate datetime2

    , LoginID nvarchar(30));

    BEGIN TRANSACTION

    UPDATE Categories

    SET CategoryName = 'Dried Produce'

    OUTPUT inserted.CategoryID, deleted.CategoryName

    , inserted.CategoryName, getdate(), SUSER_SNAME()

    INTO @CategoryChanges

    WHERE CategoryID = 7;

    SELECT * FROM @CategoryChanges --first select statement

    ROLLBACK TRANSACTION

    SELECT * FROM @CategoryChanges --second select statement