La buena noticia es que una transacción en SQL Server puede abarcar varios lotes (cada uno exec
se trata como un lote separado).
Puede envolver su EXEC
declaraciones en un BEGIN TRANSACTION
y COMMIT
pero deberá ir un paso más allá y retroceder si se produce algún error.
Idealmente, querrías algo como esto:
BEGIN TRY
BEGIN TRANSACTION
exec( @sqlHeader)
exec(@sqlTotals)
exec(@sqlLine)
COMMIT
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK
END CATCH
El BEGIN TRANSACTION
y COMMIT
Creo que ya estás familiarizado. El BEGIN TRY
y BEGIN CATCH
los bloques están básicamente ahí para capturar y manejar cualquier error que ocurra. Si alguno de sus EXEC
las declaraciones generan un error, la ejecución del código saltará a CATCH
bloquear.
Su código de construcción de SQL existente debe estar fuera de la transacción (arriba), ya que siempre desea que sus transacciones sean lo más breves posible.