如何获取受存储过程影响的logging数?

对于直接针对数据库执行的INSERTUPDATEDELETE SQL语句,大多数数据库提供程序返回受影响的行数。 对于存储过程,受影响的logging数始终为-1

我们如何获得受存储过程影响的logging数?

注册存储过程的out参数,如果使用SQL Server,则基于@@ ROWCOUNT设置值。 如果您使用的是Oracle,请使用SQL%ROWCOUNT。

请注意,如果您有多个INSERT / UPDATE / DELETE,则需要一个variables来存储@@ ROWCOUNT对每个操作的结果。

@@RowCount会给你一个SQL语句影响的logging数。

@@RowCount只有在您之后立即发布时才有效。 所以,如果你陷阱错误,你必须在同一条线上。 如果你把它分开,你会错过任何一个你放在第二位。

 SELECT @NumRowsChanged = @@ROWCOUNT, @ErrorCode = @@ERROR 

如果您有多个语句,则必须捕获每个语句受影响的行数并将其添加。

 SELECT @NumRowsChanged = @NumRowsChanged + @@ROWCOUNT, @ErrorCode = @@ERROR 

对我来说SET NOCOUNT ON在存储过程脚本(默认在SQL Server Management Studio)和SqlCommand.ExecuteNonQuery(); 总是返回-1。

我只是把它closures: SET NOCOUNT OFF不需要使用@@ROWCOUNT

在这里find更多的细节: SqlCommand.ExecuteNonQuery()做插入/更新/删除时返回-1

对于Microsoft SQL Server,可以返回@@ ROWCOUNTvariables以返回存储过程中最后一条语句影响的行数。

@@ ROWCOUNT

警告: @@ROWCOUNT可能会返回虚假的数据,如果表被更改的触发器连接到它!

@@ROWCOUNT将返回受TRIGGER影响的logging数,而不是实际的语句!