简体   繁体   English

sql存储过程中的多个更新

[英]sql multiple updates in stored procedure

What is the best way to handle return values when using multiple update statements in a stored procedure. 在存储过程中使用多个更新语句时,处理返回值的最佳方法是什么。

I am using this stored procedure in a data adapter and am trying to get the update result total. 我在数据适配器中使用此存储过程,并尝试获取更新结果总计。

I'm using SQL Server 2008 and .NET 4.5 我正在使用SQL Server 2008和.NET 4.5

For example: 例如:

CREATE PROCEDURE [dbo].[usrsp_MessageConversation_delete]
(
    @fromMbrID int,
    @toMbrID int
)
AS
BEGIN
SET NOCOUNT OFF;
UPDATE mbr_Messages
SET  fromDeleted = 1
WHERE (fromMbrID = @fromMbrID) AND (toMbrID = @toMbrID)

UPDATE mbr_Messages
    SET toDeleted = 1
WHERE (fromMbrID = @toMbrID) AND (toMbrID = @fromMbrID)

//RETURN TOTAL NUMBER OF UPDATED RECORDS
    EG: RETURN  @@ROWCOUNT ??

END

I want to return the total number of updated records or 0 if non were updated. 我想返回更新记录的总数,如果未更新则返回0。

Do I need to add any other error handling - if so any suggestions? 我是否需要添加任何其他错误处理 - 如果有任何建议?

UPDATE: I ended up going with this: 更新:我最终得到了这个:

BEGIN

SET NOCOUNT ON;

DECLARE @rowCounter INT;

BEGIN TRY 

    UPDATE 
        mbr_Messages
    SET 
        fromDeleted = 1
    WHERE 
        (fromMbrID = @fromMbrID) AND (toMbrID = @toMbrID) AND (fromDeleted = 0);

    SET @rowCounter = @@ROWCOUNT;

    UPDATE 
        mbr_Messages
    SET 
        toDeleted = 1
    WHERE 
        (fromMbrID = @toMbrID) AND (toMbrID = @fromMbrID) AND (toDeleted = 0);

    SET @rowCounter = @rowCounter + @@ROWCOUNT;

END TRY
BEGIN CATCH
    PRINT 'Update failed';
END CATCH 

RETURN @rowCounter

END

You want to do something like below: 你想做类似下面的事情:

CREATE PROCEDURE [dbo].[usrsp_MessageConversation_delete]
(
    @fromMbrID int,
    @toMbrID int
)
AS
BEGIN
SET NOCOUNT OFF;
    DECLARE @RowCount1 INTEGER
    DECLARE @RowCount2 INTEGER
    DECLARE @TotalRows INTEGER

UPDATE mbr_Messages
SET  fromDeleted = 1
WHERE (fromMbrID = @fromMbrID) AND (toMbrID = @toMbrID)

SET @RowCount1=@@RowCount

UPDATE mbr_Messages
    SET toDeleted = 1
WHERE (fromMbrID = @toMbrID) AND (toMbrID = @fromMbrID)

SET @RowCount2=@@RowCount

SET @TotalRows = @RowCount1 + @RowCount2

--RETURN TOTAL NUMBER OF UPDATED RECORDS
  RETURN  @TotalRows

END

You need to assign @@RowCount to some variable as it gets reset once you use it. 您需要将@@ RowCount分配给某个变量,因为它在您使用后会重置。

Edit: 编辑:

Also add error handling code: Try..Catch and Transactions. 还要添加错误处理代码:Try..Catch and Transactions。

If your stored procedure is short, I not really suggest to use any error handling. 如果您的存储过程很短,我真的不建议使用任何错误处理。

But here is one example for error handling 但这是错误处理的一个例子

IF @@ERROR <> 0 
BEGIN
   --your statement 
   return 12345; -- to mark your error location 
END

More information about @@Error 有关@@ Error的更多信息

Use a transaction, near the start of your procedure use this command to start a transaction: 在程序开始附近使用事务使用此命令启动事务:

BEGIN TRANSACTION

Check for errors in your script (can be used multiple times) 检查脚本中的错误(可以多次使用)

IF @@ERROR <> 0
BEGIN
    ROLLBACK
    RAISERROR ('error updating something', 16,1)
    RETURN
END

then at the end of your script commit the transaction 然后在脚本结束时提交事务

COMMIT

you can use OUTPUT clause to count updated/inserted or deleted records 您可以使用OUTPUT子句来计算更新/插入或删除的记录

DECLARE @MyTableVar table (
flagdeleted bit NOT NULL);

UPDATE mbr_Messages
SET fromDeleted = 1
OUTPUT INSERTED.fromDeleted INTO @MyTableVar 
WHERE (fromMbrID = @fromMbrID) AND (toMbrID = @toMbrID)

UPDATE mbr_Messages
SET toDeleted = 1
OUTPUT INSERTED.toDeleted INTO @MyTableVar 
WHERE (fromMbrID = @toMbrID) AND (toMbrID = @fromMbrID)

SELECT COUNT(*) FROM @MyTableVar //here is the number of updated records
CREATE PROCEDURE [dbo].[usrsp_MessageConversation_delete]
(
    @fromMbrID int,
    @toMbrID int
)
AS
DECLARE 
@SQL1 VARCHAR(800),
@SQL2 VARCHAR(800)
BEGIN
SET NOCOUNT OFF;

SET @SQL1 ='
UPDATE mbr_Messages
SET  fromDeleted = ''1''
WHERE (fromMbrID = '+@fromMbrID+') AND (toMbrID = '+@toMbrID+')'
PRINT @SQL1

SET @SQL2 ='
UPDATE mbr_Messages
    SET toDeleted = ''1''
WHERE (fromMbrID = '+@toMbrID+') AND (toMbrID = '+@fromMbrID+')'

PRINT @sql2


EXEC(@SQL1)

EXEC(@SQL2)
END

Try this 尝试这个

BEGIN TRY
BEGIN TRAN
 -- Your code here
COMMIT TRAN
END TRY
BEGIN CATCH
    ROLLBACK TRAN
END CATCH

This will return number of rows affected (updated row). 这将返回受影响的行数(更新的行)。 0 (affected row will be 0 after roll back) if error. 如果错误,则0(回滚后受影响的行将为0)。

The return value for SqlCommand.ExecuteNonQuery will give you the number of rows affected by your query. SqlCommand.ExecuteNonQuery的返回值将为您提供查询所影响的行数。 In your case it will add the row counts of the two UPDATE statements in your proc. 在您的情况下,它将在您的proc中添加两个UPDATE语句的行计数。 There is no need to add a RETURN statement to your stored procedure. 无需向存储过程添加RETURN语句。

SqlCommand command;
...
int numberOfRecords = command.ExecuteNonQuery();

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

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