La bonne nouvelle est qu'une transaction dans SQL Server peut s'étendre sur plusieurs lots (chaque exec est traité comme un lot séparé.)
Vous pouvez envelopper votre EXEC déclarations dans un BEGIN TRANSACTION et COMMIT mais vous devrez aller plus loin et revenir en arrière si des erreurs se produisent.
Idéalement, vous voudriez quelque chose comme ceci :
BEGIN TRY
BEGIN TRANSACTION
exec( @sqlHeader)
exec(@sqlTotals)
exec(@sqlLine)
COMMIT
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK
END CATCH
Le BEGIN TRANSACTION et COMMIT Je crois que vous êtes déjà familier avec. Le BEGIN TRY et BEGIN CATCH les blocs sont essentiellement là pour détecter et gérer les erreurs qui se produisent. Si l'un de vos EXEC génèrent une erreur, l'exécution du code passera au CATCH bloquer.
Votre code de construction SQL existant doit être en dehors de la transaction (ci-dessus) car vous souhaitez toujours que vos transactions soient aussi courtes que possible.