【问题标题】:Multiple update statements in one StoredProcedure一个 StoredProcedure 中的多个更新语句
【发布时间】:2009-04-20 09:36:25
【问题描述】:

我想知道存储过程中是否可以有多个 Update 语句

类似这样的:

Update Table1 set field1 = @new_value where id = @table1_id

Update Table2 set field2 = @new_value where id = @table2_id

Update Table3 set field3 = @new_value where id = @table3_id

现在我正在单独执行它们,但由于它们只一起使用,我想知道它们是否可以只位于一个 SP 中。

【问题讨论】:

  • 这是使用存储过程的原因之一,添加事务和错误处理,您就有了很好的解决方案

标签: sql stored-procedures


【解决方案1】:

是的,有可能:

CREATE PROCEDURE prc_update (@table1_id INT, @table2_id INT, @table3_id INT, @new_value INT)
AS
BEGIN
        UPDATE  Table1
        SET     field1 = @new_value
        WHERE   id = @table1_id

        UPDATE  Table2
        SET     field2 = @new_value
        WHERE   id = @table2_id

        UPDATE  Table3
        SET     field3 = @new_value
        WHERE   id = @table3_id
END

【讨论】:

  • 哇,这有点令人尴尬,我当然尝试过这个并不断收到语法错误,并以某种方式得出结论这是不可能的,只是再次尝试并完美运行!谢谢:)
  • @The real napster:你会把Quassnoi 的答案标记为答案吗?谢谢。
【解决方案2】:

是的,效果很好。

在更新前也把这个放在存储过程中:

set nocount on

这可以防止存储过程为没有结果的查询创建结果集。否则每次更新都会产生一个空的结果集,并发送回客户端。

【讨论】:

    【解决方案3】:

    您也应该将这些语句包装在事务中,以便如果一个失败,所有语句都会回滚。

    【讨论】:

      【解决方案4】:

      下面是带有事务、nocounton 和多个更新查询的存储过程。

       CREATE PROCEDURE prc_update (@table1_id INT, @table2_id INT, @table3_id INT, 
       @new_value INT)
       AS
       BEGIN
       BEGIN TRY
      
       Set Nocount ON
       Begin Transaction
       Save Transaction BeforeTransactionSavePoint
          UPDATE  Table1
          SET     field1 = @new_value
          WHERE   id = @table1_id
      
          UPDATE  Table2
          SET     field2 = @new_value
          WHERE   id = @table2_id
      
          UPDATE  Table3
          SET     field3 = @new_value
          WHERE   id = @table3_id
         Commit Transaction
      END TRY  
      BEGIN CATCH
      
      If @@TRANCOUNT > 0
      Rollback Tran BeforeTransactionSavePoint
      DECLARE  
       @ErMessage NVARCHAR(2048),  
       @ErSeverity INT,  
       @ErState INT  
      
       SELECT  
       @ErMessage = ERROR_MESSAGE(),  
       @ErSeverity = ERROR_SEVERITY(),  
       @ErState = ERROR_STATE()  
      
       RAISERROR (@ErMessage,@ErSeverity,@ErState )  
       END
      

      【讨论】:

      • 如果我从 Access 前端执行此存储过程,是否有任何方法可以将这些错误语句写入表?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-22
      • 1970-01-01
      • 1970-01-01
      • 2015-08-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多