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