web-dev-qa-db-fra.com

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

Disons que j'ai une instruction SQL syntaxiquement et sémantiquement correcte, donc 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 brisé quelque chose, l'annulation (dans une requête distincte?)

119
Niels Bosma

Le plus simple est d’envelopper 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 le traitement des erreurs, vous pouvez le faire en utilisant un BLOCK TRY ... CATCH. En cas d'erreur, vous pouvez alors annuler la transformation 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 vous aidera, mais s'il vous plaît, laissez-moi savoir si vous avez besoin de plus de détails.

219
John Sansom

Je veux ajouter un point que vous pouvez également (et si vous devez écrire si ce que vous écrivez est complexe), ajouter une variable de test à annuler si vous êtes en mode test. Ensuite, vous pouvez exécuter le tout en une fois. Souvent, j'ajoute également du code pour afficher les résultats avant et après de diverses opérations, en particulier 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
5
HLGEM