Il modo migliore per lavorare con le transazioni in MS SQL Server Management Studio


127

Diciamo che ho un'istruzione SQL che è sintatticamente e semanticamente corretta, quindi viene eseguita.

In Management Studio (o qualsiasi altro strumento di query) come posso testare le istruzioni SQL e se noto che hanno rotto qualcosa, rollback (in una query separata?)

Risposte:


227

La cosa più semplice da fare è racchiudere il codice in una transazione e quindi eseguire ogni batch di codice T-SQL riga per riga.

Per esempio,

Begin Transaction

         -Do some T-SQL queries here.

Rollback transaction -- OR commit transaction

Se si desidera incorporare la gestione degli errori, è possibile farlo utilizzando un TRY ... CATCH BLOCK. In caso di errore, è possibile eseguire il rollback della transazione all'interno del blocco catch.

Per esempio:

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

Vedi il seguente link per maggiori dettagli.

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

Spero che questo aiuti, ma per favore fatemi sapere se avete bisogno di maggiori dettagli.


3
Ciao grazie. Ho visto per la prima volta circa @@ TRANCOUNT qui e puoi dirmi cosa succede a "IF @@ TRANCOUNT> 0 COMMIT TRANSACTION" dopo l'elaborazione ROLLBACK? e che valore ha @@ TRANCOUNT? Grazie ancora.
QMaster,

2
Dopo aver eseguito ROLLBACK TRANSACTION @@ TRANCOUNT viene riportato a 0. In questo caso, COMMIT TRANSACTION non verrà eseguito. Vedi msdn.microsoft.com/de-de/library/ms187967.aspx
Christoph Brückmann

8

Voglio aggiungere un punto che puoi anche (e se ciò che stai scrivendo è complesso) aggiungere una variabile di prova al rollback se sei in modalità test. Quindi puoi eseguire tutto in una volta. Spesso aggiungo anche codice per vedere i risultati prima e dopo di varie operazioni, specialmente se si tratta di uno script complesso.

Esempio sotto:

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.