簡體   English   中英

sql存儲過程中的多個更新

[英]sql multiple updates in stored procedure

在存儲過程中使用多個更新語句時,處理返回值的最佳方法是什么。

我在數據適配器中使用此存儲過程,並嘗試獲取更新結果總計。

我正在使用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

你想做類似下面的事情:

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 and Transactions。

如果您的存儲過程很短,我真的不建議使用任何錯誤處理。

但這是錯誤處理的一個例子

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

有關@@ Error的更多信息

在程序開始附近使用事務使用此命令啟動事務:

BEGIN TRANSACTION

檢查腳本中的錯誤(可以多次使用)

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

然后在腳本結束時提交事務

COMMIT

您可以使用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

嘗試這個

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

這將返回受影響的行數(更新的行)。 如果錯誤,則0(回滾后受影響的行將為0)。

SqlCommand.ExecuteNonQuery的返回值將為您提供查詢所影響的行數。 在您的情況下,它將在您的proc中添加兩個UPDATE語句的行計數。 無需向存儲過程添加RETURN語句。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM