A boa notícia é que uma transação no SQL Server pode abranger vários lotes (cada
exec
é tratado como um lote separado.) Você pode envolver seu
EXEC
instruções em um BEGIN TRANSACTION
e COMMIT
mas você precisará dar um passo adiante e reverter se ocorrer algum erro. O ideal é que você queira algo assim:
BEGIN TRY
BEGIN TRANSACTION
exec( @sqlHeader)
exec(@sqlTotals)
exec(@sqlLine)
COMMIT
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK
END CATCH
A
BEGIN TRANSACTION
e COMMIT
Acredito que você já esteja familiarizado. O BEGIN TRY
e BEGIN CATCH
os blocos estão basicamente lá para capturar e lidar com quaisquer erros que ocorram. Se algum de seus EXEC
instruções geram um erro, a execução do código irá pular para o CATCH
quadra. Seu código de construção SQL existente deve estar fora da transação (acima), pois você sempre deseja manter suas transações o mais curtas possível.