La buona notizia è che una transazione in SQL Server può estendersi su più batch (ogni exec
viene trattato come un batch separato.)
Puoi avvolgere il tuo EXEC
istruzioni in un BEGIN TRANSACTION
e COMMIT
ma dovrai fare un ulteriore passo avanti e ripristinare se si verificano errori.
Idealmente vorresti qualcosa del genere:
BEGIN TRY
BEGIN TRANSACTION
exec( @sqlHeader)
exec(@sqlTotals)
exec(@sqlLine)
COMMIT
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK
END CATCH
Il BEGIN TRANSACTION
e COMMIT
Credo che tu abbia già familiarità con. Il BEGIN TRY
e BEGIN CATCH
i blocchi sono fondamentalmente lì per catturare e gestire eventuali errori che si verificano. Se uno qualsiasi dei tuoi EXEC
le istruzioni generano un errore, l'esecuzione del codice salterà al CATCH
bloccare.
Il tuo codice di costruzione SQL esistente dovrebbe essere al di fuori della transazione (sopra) poiché vuoi sempre mantenere le tue transazioni il più brevi possibile.