Лучший способ работы с транзакциями в MS SQL Server Management Studio

Допустим, у меня есть синтаксически и семантически правильный оператор SQL, поэтому он выполняется.

В Management Studio (или в любом другом инструменте запросов) как я могу протестировать операторы SQL, и если я заметил, что они что-то сломали, откат (в отдельном запросе?)


person Niels Bosma    schedule 03.02.2009    source источник


Ответы (2)


Самый простой способ - обернуть ваш код транзакцией, а затем выполнить каждый пакет кода T-SQL построчно.

Например,

Begin Transaction

         -Do some T-SQL queries here.

Rollback transaction -- OR commit transaction

Если вы хотите включить обработку ошибок, вы можете сделать это с помощью TRY ... CATCH BLOCK. В случае возникновения ошибки вы можете откатить преобразование в блоке catch.

Например:

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

См. Следующую ссылку для получения более подробной информации.

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

Надеюсь, это поможет, но, пожалуйста, дайте мне знать, если вам понадобится дополнительная информация.

person John Sansom    schedule 03.02.2009
comment
Привет спасибо. Я впервые увидел здесь про @@ TRANCOUNT, и вы можете рассказать мне, что происходит с IF @@ TRANCOUNT ›0 COMMIT TRANSACTION после обработки ROLLBACK? и какое значение имеет @@ TRANCOUNT? Еще раз спасибо. - person QMaster; 21.06.2015
comment
После исключения ROLLBACK TRANSACTION @@ TRANCOUNT возвращается в 0. При этом COMMIT TRANSACTION не будет выполняться. См. msdn.microsoft.com/de-de/library/ms187967.aspx - person Christoph Brückmann; 01.11.2016

Я хочу добавить, что вы также можете (и должны, если то, что вы пишете, является сложным) добавить тестовую переменную для отката, если вы находитесь в тестовом режиме. Тогда вы сможете выполнить все сразу. Часто я также добавляю код, чтобы увидеть результаты различных операций до и после, особенно если это сложный сценарий.

Пример ниже:

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
person HLGEM    schedule 30.06.2016