SQL Server存储过程在事务中运行插入/更新

时间:2018-10-06 10:00:36

标签: sql-server sql-server-2008 pentaho-data-integration

我必须使用插入和更新指令来执行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 :(得分:1)

您可以使用事务创建存储过程。 尝试这样。

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