[英]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.