La mejor manera de trabajar con transacciones en MS SQL Server Management Studio

127

Digamos que tengo una instrucción SQL que es sintáctica y semánticamente correcta para que se ejecute.

En Management Studio (o cualquier otra herramienta de consulta), ¿cómo puedo probar las instrucciones SQL y, si me doy cuenta de que rompieron algo, deshacer (en una consulta separada)

Niels Bosma
fuente

Respuestas:

227

Lo más fácil es envolver su código en una transacción y luego ejecutar cada lote de código T-SQL línea por línea.

Por ejemplo,

Begin Transaction

         -Do some T-SQL queries here.

Rollback transaction -- OR commit transaction

Si desea incorporar el manejo de errores, puede hacerlo mediante el uso de TRY ... CATCH BLOCK. Si se produce un error, puede revertir la transmisión dentro del bloque catch.

Por ejemplo:

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

Vea el siguiente enlace para más detalles.

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

Espero que esto ayude, pero avíseme si necesita más detalles.

John Sansom
fuente
3
Hola Gracias. Vi por primera vez acerca de @@ TRANCOUNT aquí y ¿puede decirme qué sucede con "IF @@ TRANCOUNT> 0 COMMIT TRANSACTION" después del procesamiento de ROLLBACK? ¿Y qué valor tiene @@ TRANCOUNT? Gracias de nuevo.
QMaster
2
Después de excitar la TRANSACCIÓN ROLLBACK @@ TRANCOUNT se restablece a 0. Por eso, la TRANSACCIÓN DE COMPROMISO no se ejecutará. Ver msdn.microsoft.com/de-de/library/ms187967.aspx
Christoph Brückmann el
8

Quiero agregar un punto que también puede (y debería si lo que está escribiendo es complejo) agregar una variable de prueba para revertir si está en modo de prueba. Entonces puedes ejecutar todo de una vez. A menudo también agrego código para ver los resultados antes y después de varias operaciones, especialmente si se trata de un script complejo.

Ejemplo a continuación:

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
fuente