Хранимая процедура SQL Server для запуска вставки / обновления в транзакции - PullRequest
0 голосов
/ 06 октября 2018

Мне нужно выполнить блоки T-SQL с инструкциями по вставке и обновлению.

Допустим, у меня есть эти два блока кода, и у меня нет прямого контроля над ними.

Блок# 1:

insert into mytable (id, col1) 
values ((select max(id) + 1 from mytable), 'foo');

insert into non_existing_table (id, col1)  
values ((select max(id) from mytable), 'bar');

Блок № 2:

insert into mytable (id, col1) 
values ((select max(id) + 1 from mytable), 'foo');

insert into anothertable (id, col1) 
values ((select max(id) from mytable), 'bar');

В первом блоке есть две инструкции, первая в порядке, вторая не выполнена, поскольку вторая таблица не существует,

Во втором блоке также есть две инструкции, обе в порядке.

Я хочу запустить оба блока

  • Первый блок должен сделатьничего в конце, так как вторая инструкция завершается неудачно, первая должна быть откатана
  • Второй блок в порядке, так как ошибки нет, обе вставки должны быть зафиксированы

Чтоправильный способ сделать это?Может быть, хранимая процедура, которая принимает полнотекстовый параметр и запускает весь код как транзакцию?Как я могу сделать это в SQL Server?

1 Ответ

0 голосов
/ 06 октября 2018

Вы можете создать хранимую процедуру с транзакциями.Попробуйте вот так.

CREATE PROCEDURE [dbo].[Procedure_name]
@iErrorCode int OUTPUT,
--other parameters
AS
BEGIN
   BEGIN TRY
     begin tran

        insert into mytable (id,col1) values ((select max(id)+1 from mytable),'foo');
        insert into non_existing_table (id,col1) values ((select max(id) from mytable),'bar');
        --other queries

     commit tran
     SELECT  @iErrorCode =@@ERROR;
   END TRY
   BEGIN CATCH
      rollback tran
      Select ERROR_NUMBER();
      Select ERROR_MESSAGE();
      SELECT  @iErrorCode =@@ERROR
   END CATCH
END 
...