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.