SQL Server XACT_ABORT с исключением
У меня есть большая хранимая процедура, которая использует несколько блоков TRY / CATCH, чтобы отлавливать и регистрировать отдельные ошибки. Я также обернул транзакцию вокруг всего содержимого процедуры, чтобы иметь возможность откатить всю вещь в случае ошибки, возникшей где-то по пути (чтобы предотвратить много грязной очистки); XACT_ABORT был включен, поскольку в противном случае он не откатил бы всю транзакцию.
Ключевой компонент:
В моей базе данных есть таблица, в которую вставляется запись при каждом запуске этой процедуры с результатами операций и подробностями о том, что пошло не так.
Происходит забавная вещь - на самом деле, когда я наконец выяснил, что было не так, это было довольно очевидно ... оператор вставки в мою таблицу журналов также откатывается, следовательно, если я не запускаю это из SSMS, Я не смогу увидеть, что это даже было выполнено, так как откат удаляет все трансы активности.
Вопрос:
Можно ли было бы откатить всю транзакцию за исключением этого единственного оператора вставки? Я все еще хотел бы сохранить сообщение об ошибке, которое я компилирую во время выполнения хранимой процедуры.
Спасибо!
~ Eli
Обновление 6/28
Вот пример кода того, на что я смотрю. Ключевое различие между этим и примерами, представленными @Alex и @gameiswar, состоит в том, что в моем случае блоки try / catch все вложены в одну транзакцию. Цель этого состоит в том, чтобы иметь несколько уловов (для нескольких таблиц), хотя мы бы откатили весь беспорядок, даже если последнее обновление не удалось.
SET XACT_ABORT ON;
BEGIN TRANSACTION
DECLARE @message AS VARCHAR(MAX) = '';
-- TABLE 1
BEGIN TRY
UPDATE TABLE xx
SET yy = zz
END TRY
BEGIN CATCH
SET @message = 'TABLE 1 '+ ERROR_MESSAGE();
INSERT INTO LOGTABLE
SELECT
GETDATE(),
@message
RETURN;
END CATCH
-- TABLE 2
BEGIN TRY
UPDATE TABLE sss
SET tt = xyz
END TRY
BEGIN CATCH
SET @message = 'TABLE 2 '+ ERROR_MESSAGE();
INSERT INTO LOGTABLE
SELECT
GETDATE(),
@message
RETURN;
END CATCH
COMMIT TRANSACTION