Dobrą wiadomością jest to, że transakcja w SQL Server może obejmować wiele partii (każdy exec jest traktowana jako oddzielna partia).
Możesz zawinąć swój EXEC oświadczenia w BEGIN TRANSACTION i COMMIT ale musisz pójść o krok dalej i wycofać, jeśli wystąpią jakiekolwiek błędy.
Idealnie byłoby coś takiego:
BEGIN TRY
BEGIN TRANSACTION
exec( @sqlHeader)
exec(@sqlTotals)
exec(@sqlLine)
COMMIT
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK
END CATCH
BEGIN TRANSACTION i COMMIT Wierzę, że już znasz. BEGIN TRY i BEGIN CATCH bloki są w zasadzie po to, aby wyłapywać i radzić sobie z pojawiającymi się błędami. Jeśli którykolwiek z Twoich EXEC instrukcje zgłaszają błąd, wykonanie kodu przeskoczy do CATCH blok.
Twój istniejący kod budowania SQL powinien znajdować się poza transakcją (powyżej), ponieważ zawsze chcesz, aby transakcje były jak najkrótsze.