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.