Meilleure façon de travailler avec des transactions dans MS SQL Server Management Studio

127

Disons que j'ai une instruction SQL qui est syntaxiquement et sémantiquement correcte afin qu'elle s'exécute.

Dans Management Studio (ou tout autre outil de requête), comment puis-je tester les instructions SQL, et si je remarque qu'elles ont cassé quelque chose, revenir en arrière (dans une requête distincte?)

Niels Bosma
la source

Réponses:

227

La chose la plus simple à faire est d'encapsuler votre code dans une transaction, puis d'exécuter chaque lot de code T-SQL ligne par ligne.

Par exemple,

Begin Transaction

         -Do some T-SQL queries here.

Rollback transaction -- OR commit transaction

Si vous souhaitez intégrer la gestion des erreurs, vous pouvez le faire en utilisant un BLOC TRY ... CATCH. Si une erreur se produit, vous pouvez annuler la tranasction dans le bloc catch.

Par exemple:

USE AdventureWorks;
GO
BEGIN TRANSACTION;

BEGIN TRY
    -- Generate a constraint violation error.
    DELETE FROM Production.Product
    WHERE ProductID = 980;
END TRY
BEGIN CATCH
    SELECT 
        ERROR_NUMBER() AS ErrorNumber
        ,ERROR_SEVERITY() AS ErrorSeverity
        ,ERROR_STATE() AS ErrorState
        ,ERROR_PROCEDURE() AS ErrorProcedure
        ,ERROR_LINE() AS ErrorLine
        ,ERROR_MESSAGE() AS ErrorMessage;

    IF @@TRANCOUNT > 0
        ROLLBACK TRANSACTION;
END CATCH;

IF @@TRANCOUNT > 0
    COMMIT TRANSACTION;
GO

Voir le lien suivant pour plus de détails.

http://msdn.microsoft.com/en-us/library/ms175976.aspx

J'espère que cela aide mais s'il vous plaît laissez-moi savoir si vous avez besoin de plus de détails.

John Sansom
la source
3
Salut merci. J'ai vu pour la première fois à propos de @@ TRANCOUNT ici et pouvez-vous me dire ce qui est arrivé à "IF @@ TRANCOUNT> 0 COMMIT TRANSACTION" après le traitement ROLLBACK? et quelle valeur a @@ TRANCOUNT? Merci encore.
QMaster
2
Après avoir exécuté ROLLBACK TRANSACTION @@ TRANCOUNT est remis à 0. Par cela, COMMIT TRANSACTION ne sera pas exécuté. Voir msdn.microsoft.com/de-de/library/ms187967.aspx
Christoph Brückmann
8

Je veux ajouter un point sur lequel vous pouvez également (et devriez si ce que vous écrivez est complexe) ajouter une variable de test à restaurer si vous êtes en mode test. Ensuite, vous pouvez exécuter le tout en même temps. Souvent, j'ajoute également du code pour voir les résultats avant et après de diverses opérations, surtout s'il s'agit d'un script complexe.

Exemple ci-dessous:

USE AdventureWorks;
GO
DECLARE @TEST INT = 1--1 is test mode, use zero when you are ready to execute
BEGIN TRANSACTION;

BEGIN TRY
     IF @TEST= 1
        BEGIN
            SELECT *FROM Production.Product
                WHERE ProductID = 980;
        END    
    -- Generate a constraint violation error.
    DELETE FROM Production.Product
    WHERE ProductID = 980;

     IF @TEST= 1
        BEGIN
            SELECT *FROM Production.Product
                WHERE ProductID = 980;
            IF @@TRANCOUNT > 0
                ROLLBACK TRANSACTION;
        END    
END TRY

BEGIN CATCH
    SELECT 
        ERROR_NUMBER() AS ErrorNumber
        ,ERROR_SEVERITY() AS ErrorSeverity
        ,ERROR_STATE() AS ErrorState
        ,ERROR_PROCEDURE() AS ErrorProcedure
        ,ERROR_LINE() AS ErrorLine
        ,ERROR_MESSAGE() AS ErrorMessage;

    IF @@TRANCOUNT > 0
        ROLLBACK TRANSACTION;
END CATCH;

IF @@TRANCOUNT > 0 AND @TEST = 0
    COMMIT TRANSACTION;
GO
HLGEM
la source