【问题标题】:SQL Server stored procedure to run insert/update in transactionSQL Server 存储过程在事务中运行插入/更新
【发布时间】:2023-04-07 23:01:01
【问题描述】:

我必须使用插入和更新指令执行 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');

在第一个块中有两条指令,第一个是可以的,第二个失败是因为第二个表不存在。

第二个block里面也有两条指令,都可以。

我想要做的是运行两个块

  • 第一个块最后应该什么都不做,因为第二个指令失败,第一个应该回滚
  • 第二个块没问题,因为没有错误,两个插入都应该提交

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

【问题讨论】:

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


【解决方案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 

【讨论】:

  • 是否可以创建一个接受通用文本输入并像 sql 指令一样运行它的过程?所以我可以使用相同的过程来调用我所有的块。
  • 我建议你有礼貌地尝试(如果合适,接受)这个问题,而不是仅仅提出一个新问题。您想做的是一个坏主意,如果您想找出原因,请在新问题中提出。
猜你喜欢
  • 2012-10-13
  • 2010-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-02
  • 1970-01-01
  • 2015-03-02
相关资源
最近更新 更多