繁体   English   中英

一个 StoredProcedure 中的多个更新语句

[英]Multiple update statements in one StoredProcedure

我想知道是否可以在存储过程中有多个 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 中。

是的,这是可能的:

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

是的,这很好用。

在更新之前也把它放在存储过程中:

set nocount on

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

您还应该将这些语句包装在事务中,以便在失败时所有语句都回滚。

下面是带有事务、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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM