SQL-запрос, который будет отменен, если какие-либо операторы не будут выполнены - PullRequest
4 голосов
/ 10 февраля 2010

Я хотел бы написать сценарий SQL, который выполняет несколько отдельных операторов SQL; если какое-либо из этих утверждений окажется неудачным, я бы хотел откатить всю транзакцию. Итак, что-то вроде:

BEGIN TRANSACTION

insert into TestTable values (1)
insert into TestTable values (2)
insert into TestTabe values (3)

--if any of the statements fail
ROLLBACK
--else
COMMIT

Это для MS SQL 2008. Что я могу сделать для этого? Возможно, какая-то обработка исключений?

Я понимаю, что в моем примере я мог бы проверить TestTable на предмет этих значений и определить, не прошли ли операторы таким образом. Но на самом деле мой SQL будет намного сложнее, и я бы предпочел абстрагироваться от знания того, что делает SQL.

Ответы [ 3 ]

7 голосов
/ 10 февраля 2010

SQL Server поддерживает исключение с 2005 года:

BEGIN TRY
    BEGIN TRAN

    INSERT INTO ...

    COMMIT TRAN
END TRY
BEGIN CATCH
    EXECUTE usp_LogAndRethrowError
END CATCH

Ваш LogAndRethrowError может затем откатить любые обреченные транзакции, например:

-- Make sure we are not in a live or 'doomed' transaction
IF XACT_STATE() <> 0
ROLLBACK TRANSACTION
5 голосов
/ 10 февраля 2010

Это один из способов, которым я делал это в прошлом:

Declare @HasError int;
set @HasError = 0;

BEGIN TRANSACTION

insert into TestTable values (1)
if (@@ERROR != 0)
    set @HasError = 1
insert into TestTable values (2)
if (@@ERROR != 0)
    set @HasError = 1
insert into TestTabe values (3)
if (@@ERROR != 0)
    set @HasError = 1

if @HasError > 0
    ROLLBACK TRANSACTION
ELSE
    COMMIT TRANSACTION
1 голос
/ 10 февраля 2010

Я ленивый и добавил эту строку ко всем своим высказываниям

SET XACT_ABORT ON

http://technet.microsoft.com/en-us/library/ms188792.aspx

Когда SET XACT_ABORT включен, если Оператор Transact-SQL поднимает ошибка во время выполнения, вся транзакция завершается и откатывается.

Когда SET XACT_ABORT выключен, в некоторых только для операторов Transact-SQL что подняло ошибку откатывается и транзакция продолжается обработка. В зависимости от Серьезность ошибки, вся транзакция может быть отменена даже когда SET XACT_ABORT выключен. ВЫКЛ это настройка по умолчанию.

Ошибки компиляции, такие как синтаксические ошибки, SET XACT_ABORT не влияет.

XACT_ABORT должен быть включен для данных заявления о модификации в неявном или явная сделка против большинства Поставщики OLE DB, включая SQL Сервер. Единственный случай, когда это опция не требуется, если провайдер поддерживает вложенные транзакции. Для получения дополнительной информации см. Распределенный Запросы и распределенные транзакции.

Настройка SET XACT_ABORT установлена во время выполнения или выполнения, а не в время разбора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...