2

在存储过程中使用多个更新语句时处理返回值的最佳方法是什么。

我在数据适配器中使用这个存储过程,并试图获取更新结果总数。

我正在使用SQL Server 2008和 .NET 4.5

例如:

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

我想返回更新记录的总数,如果没有更新,则返回 0。

我是否需要添加任何其他错误处理 - 如果需要,有什么建议吗?

更新:我最终选择了这个:

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
4

7 回答 7

3

您想要执行以下操作:

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

您需要将 @@RowCount 分配给某个变量,因为一旦使用它就会重置。

编辑:

还要添加错误处理代码:Try..Catch 和 Transactions。

于 2013-07-08T10:21:00.517 回答
1

如果您的存储过程很短,我真的不建议使用任何错误处理。

但这是错误处理的一个示例

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

有关@@Error的更多信息

于 2013-07-08T10:17:10.667 回答
1

使用事务,在您的过程开始附近使用此命令启动事务:

BEGIN TRANSACTION

检查脚本中的错误(可以多次使用)

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

然后在脚本结束时提交事务

COMMIT
于 2013-07-08T10:20:08.750 回答
0
创建过程 [dbo].[usrsp_MessageConversation_delete]
(
    @fromMbrID 整数,
    @toMbrID 整数
)
作为
宣布
@SQL1 VARCHAR(800),
@SQL2 VARCHAR(800)
开始
设置无计数;

设置@SQL1 ='
更新 mbr_Messages
SET fromDeleted = ''1''
哪里(fromMbrID = '+@fromMbrID+')和(toMbrID = '+@toMbrID+')'
打印@SQL1

设置@SQL2 ='
更新 mbr_Messages
    SET toDeleted = ''1''
哪里(fromMbrID = '+@toMbrID+')和(toMbrID = '+@fromMbrID+')'

打印@sql2


执行(@SQL1)

执行(@SQL2)
结尾


于 2013-07-08T10:27:19.393 回答
0

您可以使用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
于 2013-07-08T10:22:54.243 回答
0

尝试这个

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

这将返回受影响的行数(更新的行)。0(回滚后受影响的行将为 0)如果错误。

于 2013-07-08T10:28:23.967 回答
0

的返回值SqlCommand.ExecuteNonQuery将为您提供受查询影响的行数。在您的情况下,它将在您的过程中添加两个UPDATE语句的行数。无需向存储过程添加 RETURN 语句。

SqlCommand command;
...
int numberOfRecords = command.ExecuteNonQuery();
于 2013-07-08T10:56:30.403 回答