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.