Добрата новина е, че една транзакция в SQL Server може да обхваща множество партиди (всеки exec
се третира като отделна партида.)
Можете да опаковате своя EXEC
изявления в BEGIN TRANSACTION
и COMMIT
но ще трябва да отидете още една стъпка и да се върнете назад, ако възникнат грешки.
В идеалния случай бихте искали нещо подобно:
BEGIN TRY
BEGIN TRANSACTION
exec( @sqlHeader)
exec(@sqlTotals)
exec(@sqlLine)
COMMIT
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK
END CATCH
BEGIN TRANSACTION
и COMMIT
Вярвам, че вече сте запознати с. BEGIN TRY
и BEGIN CATCH
блоковете основно са там, за да улавят и обработват всички възникнали грешки. Ако някой от вашите EXEC
операторите пораждат грешка, изпълнението на кода ще премине към CATCH
блок.
Вашият съществуващ код за изграждане на SQL трябва да е извън транзакцията (по-горе), тъй като винаги искате да поддържате транзакциите си възможно най-кратки.