Den goda nyheten är att en transaktion i SQL Server kan sträcka sig över flera batcher (varje exec). behandlas som en separat batch.)
Du kan radbryta din EXEC uttalanden i en BEGIN TRANSACTION och COMMIT men du måste gå ett steg längre och återställa om några fel uppstår.
Helst skulle du vilja ha något sånt här:
BEGIN TRY
BEGIN TRANSACTION
exec( @sqlHeader)
exec(@sqlTotals)
exec(@sqlLine)
COMMIT
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK
END CATCH
BEGIN TRANSACTION och COMMIT Jag tror att du redan är bekant med. BEGIN TRY och BEGIN CATCH block är i princip till för att fånga upp och hantera eventuella fel som uppstår. Om någon av dina EXEC satser ger upphov till ett fel, kommer kodexekveringen att hoppa till CATCH blockera.
Din befintliga SQL-byggnadskod bör ligga utanför transaktionen (ovan) eftersom du alltid vill hålla dina transaktioner så korta som möjligt.