J'en ai un peu ALTER TABLE
déclarations que j'exécute. Tous ne fonctionnent pas (ils sont le résultat de l'exécution de SQL Data Compare) et je veux les regrouper dans certaines transactions et annuler les instructions en cas de problème.
Est-ce possible ou s'agit-il uniquement de données pouvant être annulées?
BEGIN TRANSACTION
BEGIN TRY
ALTER TABLE1...
ALTER TABLE2...
-- Additional data/structural changes
COMMIT
END TRY
BEGIN CATCH
ROLLBACK;
THROW; -- Only if you want reraise an exception (to determine the reason of the exception)
END CATCH
Oui, c'est possible.
La plupart des instructions DDL peuvent être annulées dans SQL Server (il existe quelques exceptions telles que CREATE DATABASE
)
Beaucoup modifications en une seule transaction avec rollback
et commit
- ce n'est pas un rêve. C'est possible.
Voici un échafaudage pour votre script (suivant directives MS avec des améliorations):
BEGIN TRANSACTION
BEGIN TRY
-- place your script in this TRY block
-- your DDL instructions:
ALTER TABLE1...
ALTER TABLE2...
-- data modifications:
EXEC('
UPDATE A
SET c1 = 23,
c2 = ''ZZXX'';
');
-- another DDL instruction:
ALTER TABLE2...
-- end of your script
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
-- If you want reraise an exception (to determine the reason of the exception)
-- just uncomment block with appropriate version:
-- SQL SERVER > 2012
/*
THROW;
*/
-- SQL SERVER < 2012 (tested against 2008 R2)
/*
DECLARE @ErrorMessage VARCHAR(MAX);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
SELECT
@ErrorMessage = ERROR_MESSAGE(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE();
RAISERROR (
@ErrorMessage, -- Message text.
@ErrorSeverity, -- Severity.
@ErrorState -- State.
);
*/
END CATCH;
IF @@TRANCOUNT > 0
COMMIT TRANSACTION;
GO
Attention, THROW
ne fonctionne que pour la version SQL SERVER> 2012. Ici, vous pouvez convertir une version de semver à notation de l'année: - http://sqlserverbuilds.blogspot.r (ne connaît pas .ru
domaine, il existe une version anglaise)
Vous devez examiner les transactions et la gestion des exceptions dans T-SQL. Découvrez les deux derniers exemples sur cette page: http://msdn.Microsoft.com/en-us/library/ms175976.aspx