Правильный способ установить явную транзакцию в хранимой процедуре - PullRequest
1 голос
/ 03 января 2012

Я создал хранимую процедуру, которая содержит 9 вставок в сводных таблицах, а последний оператор - удаление.

Эта процедура выполняется около 9 минут для каждой данной даты, и я заметил одну вещь: если произойдет ошибка и будут выполнены первые 3 вставки, она сохранит вставленные данные. Чтобы справиться с этим, я создал транзакцию начала и начала и проверил процедуру, чтобы запустить процедуру с использованием SSMS, и после ее запуска я отменил команду, но транзакция была сохранена. Как я могу избежать этого?

тело процедуры очень просто ... что-то вроде:

insert into...
insert into...
insert into...
insert into...
insert into...
insert into...
insert into...
insert into...
insert into...
insert into...
delete from....

спасибо

1 Ответ

0 голосов
/ 03 января 2012

Две вещи:

1) Основной синтаксис:

BEGIN TRY

  BEGIN TRAN

  INSERT...

  DELETE...

  COMMIT TRAN

END TRY
BEGIN CATCH

  IF (@@TRANCOUNT > 0)
  BEGIN
    ROLLBACK TRAN
  END

  DECLARE @ErrorMessage NVARCHAR(4000)
  SET @ErrorMessage = 'Line ' + CONVERT(VARCHAR(20), ERROR_LINE()) + ': '
                    + ERROR_MESSAGE()
  RAISERROR(@SQLErrString, 16, 1)

END CATCH

2) Если вы отмените пакет в процессе, вам может потребоваться запустить ROLLBACK TRAN вручную. Вы можете проверить, нужно ли вам это сделать, выполнив SELECT @@ TRANCOUNT, и если оно> 0, тогда вызовите ROLLBACK TRAN.

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