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

Sql server 在事务中运行插入/更新的SQL Server存储过程,sql-server,sql-server-2008,pentaho-data-integration,Sql Server,Sql Server 2008,Pentaho Data Integration,我必须使用insert和update指令执行T-SQL块 假设我有这两段代码,但我无法直接控制它们 第1区: 第2区: 在第一个块中有两条指令,第一条指令正常,第二条指令失败,因为第二个表不存在 在第二个块中还有两条指令,都是ok 我要做的是运行两个块 最后第一个块不应该做任何事情,因为第二条指令失败,第一条指令应该回滚 第二个块很好,因为没有错误,两个插入都应该提交 正确的方法是什么?可能是一个接受全文参数并将所有代码作为事务运行的存储过程?如何在SQL Server中实现这一点?您可以使

我必须使用insert和update指令执行T-SQL块

假设我有这两段代码,但我无法直接控制它们

第1区:

第2区:

在第一个块中有两条指令,第一条指令正常,第二条指令失败,因为第二个表不存在

在第二个块中还有两条指令,都是ok

我要做的是运行两个块

  • 最后第一个块不应该做任何事情,因为第二条指令失败,第一条指令应该回滚
  • 第二个块很好,因为没有错误,两个插入都应该提交

正确的方法是什么?可能是一个接受全文参数并将所有代码作为事务运行的存储过程?如何在SQL Server中实现这一点?

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

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 

首先,
selectmax(id)+1
是个坏主意-我建议您使用
identity
序列。其次,这里有许多解决方案之一:是否可以创建一个接受一般文本输入并像sql指令一样运行的过程?所以我可以用同样的程序来调用我所有的模块。我建议你有礼貌地尝试(如果合适的话,接受)这个问题,而不是仅仅提出一个新问题。你想做的是一个坏主意,如果你想找出原因,用一个新问题来问。
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');
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