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