对于直接针对数据库执行的INSERT
,UPDATE
和DELETE
SQL语句,大多数数据库提供程序返回受影响的行数。对于存储过程,受影响的记录数始终为-1
。
我们如何获得受存储过程影响的记录数?
答案 0 :(得分:78)
注册存储过程的out参数,如果使用SQL Server,则根据@@ROWCOUNT
设置值。如果您使用的是Oracle,请使用SQL%ROWCOUNT
。
请注意,如果您有多个INSERT/UPDATE/DELETE
,则需要一个变量来存储@@ROWCOUNT
每个操作的结果。
答案 1 :(得分:44)
@@RowCount
将为您提供受SQL语句影响的记录数。
@@RowCount
仅在您之后立即发布时才有效。因此,如果要捕获错误,则必须在同一行上执行此操作。如果你把它拆开,你将会错过你放在第二位的那个。
SELECT @NumRowsChanged = @@ROWCOUNT, @ErrorCode = @@ERROR
如果您有多个语句,则必须捕获每个语句受影响的行数并将其添加。
SELECT @NumRowsChanged = @NumRowsChanged + @@ROWCOUNT, @ErrorCode = @@ERROR
答案 2 :(得分:29)
原来,我在存储过程脚本中设置了SET NOCOUNT ON
(默认情况下在SQL Server Management Studio上),SqlCommand.ExecuteNonQuery();
总是返回-1。
我只需将其设置为SET NOCOUNT OFF
,而无需使用@@ROWCOUNT
。
更多详情请点击此处:SqlCommand.ExecuteNonQuery() returns -1 when doing Insert / Update / Delete
答案 3 :(得分:8)
对于Microsoft SQL Server,您可以返回@@ROWCOUNT
变量以返回受存储过程中最后一个语句影响的行数。
答案 4 :(得分:4)
答案 5 :(得分:-1)
警告:如果要更改的表格附有触发器,@@ROWCOUNT
可能会返回虚假数据!
@@ROWCOUNT
将返回受TRIGGER影响的记录数,而不是实际声明!