Найкращий спосіб роботи з транзакціями в MS SQL Server Management Studio


127

Скажімо, у мене є синтаксично та семантично правильний оператор SQL, щоб він виконувався.

У студії управління (або будь-який інший інструмент запитів) як я можу перевірити оператори SQL, і якщо я помітив, що вони щось зламали, відкат (в окремому запиті?)

Відповіді:


227

Найпростіша річ - загорнути свій код в транзакцію, а потім виконати кожну партію коду T-SQL рядок.

Наприклад,

Begin Transaction

         -Do some T-SQL queries here.

Rollback transaction -- OR commit transaction

Якщо ви хочете включити обробку помилок, ви можете зробити це, використовуючи TRY ... CATCH BLOCK. Якщо виникла помилка, ви можете відкатати транзакцію в блоці лову.

Наприклад:

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

Сподіваюся, це допоможе, але, будь ласка, повідомте мене, якщо вам потрібні додаткові деталі.


3
Привіт, спасибі Я вперше побачив про @@ TRANCOUNT тут, і чи можете ви сказати мені, що трапиться з "IF @@ TRANCOUNT> 0 COMMIT TRANSACTION" після обробки ROLLBACK? і яке значення має @@ TRANCOUNT? Знову дякую.
QMaster

2
Після вимкнення ROLLBACK TRANSACTION @@ TRANCOUNT повертається до 0. При цьому COMMIT TRANSACTION не буде виконаний. Дивіться msdn.microsoft.com/de-de/library/ms187967.aspx
Крістоф Брюкманн

8

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

Приклад нижче:

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.