Sql Server - Partial Rollbacks

Here's a handy little trick.

Have you ever had a big Sql Script, or maybe one that just runs for a long period of time that you have wrapped in begin transaction commit transaction blocks?

Now, if your script fails at some point, do you put in some failsafe mechanism to rollback the transaction and return? It's not an uncommon scenario. But what happens if you want some more detailed information about what went wrong, what failed etc?

How can you, for instance, insert some information or a list of records into a temp table, so that when you rollback the results are still there?

A simple solution is to use table variables. Table variables don't get affected by the transaction state, so if you insert records into these variables, they're going to persist even if you do a rollback transaction

 Here's a little example:

begin transaction

 

--Create the table variable

declare @failedDepartment table (id int, name varchar(255))

 

--Insert some info about the departments into the table variable

insert into @failedDepartment

(

    id,

    name

)

select

    Id,

    name

from

    department

 

--Blow away all the records in the department table

truncate table department

 

--Prove that there are no records left

select * from department

 

rollback transaction

 

--If the rollback affects table variables, then @failedDepartent should be empty

--but it's not

select * from @failedDepartment

As you'll see, @failedDepartments contains records. If you tried doing this with temp tables it won't work, as temp tables get affected by the transaction state.

Happy Sql'ing

posted @ Monday, November 12, 2007 8:15 AM

Print
«November»
SunMonTueWedThuFriSat
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345