Je suis entrain de créer un script qui sera exécuté dans un serveur MS SQL. Ce script va s'exécuter plusieurs instructions et doit être transactionnelle, si la déclaration d'échec de l'exécution globale est arrêté et toutes les modifications sont annulées.
J'ai de la difficulté de la création de ce modèle transactionnel lors de l'émission d'instructions ALTER TABLE pour ajouter des colonnes à une table, puis la mise à jour de la nouvelle colonne. Pour accéder à la nouvelle colonne à droite de suite, j'utilise un ALLER de commande pour exécuter l'instruction ALTER TABLE, et ensuite appeler mon instruction de mise à JOUR. Le problème, je suis confronté, c'est que je ne peut pas émettre une commande ALLER dans une instruction if. SI l'instruction est important dans mon modèle transactionnel. Ceci est un exemple de code du script que je suis en train de lancer. Notez également que la délivrance d'une commande ALLER, va jeter l' @errorCode variable, et devront être déclarés dans le code avant d'être utilisé (Ce n'est pas dans le code ci-dessous).
BEGIN TRANSACTION
DECLARE @errorCode INT
SET @errorCode = @@ERROR
-- **********************************
-- * Settings
-- **********************************
IF @errorCode = 0
BEGIN
BEGIN TRY
ALTER TABLE Color ADD [CodeID] [uniqueidentifier] NOT NULL DEFAULT ('{00000000-0000-0000-0000-000000000000}')
GO
END TRY
BEGIN CATCH
SET @errorCode = @@ERROR
END CATCH
END
IF @errorCode = 0
BEGIN
BEGIN TRY
UPDATE Color
SET CodeID= 'B6D266DC-B305-4153-A7AB-9109962255FC'
WHERE [Name] = 'Red'
END TRY
BEGIN CATCH
SET @errorCode = @@ERROR
END CATCH
END
-- **********************************
-- * Check @errorCode to issue a COMMIT or a ROLLBACK
-- **********************************
IF @errorCode = 0
BEGIN
COMMIT
PRINT 'Success'
END
ELSE
BEGIN
ROLLBACK
PRINT 'Failure'
END
Donc ce que je voudrais savoir c'est comment faire pour contourner ce problème, l'émission d'instructions ALTER TABLE pour ajouter une colonne, puis la mise à jour de cette colonne, le tout dans un script d'exécution comme une unité transactionnelle.
Merci à l'avance!