3

我正在使用 ASP.NET C# 程序中的以下 SQL 语句块:

SET XACT_ABORT ON;  --Need to roll back upon failure
BEGIN TRANSACTION;  --Need to be performed atomically
UPDATE MyTable SET Col1='SomeValue' WHERE ColID='N';
DELETE FROM MyTable WHERE ColID='X';
COMMIT;
SET XACT_ABORT OFF;

上面的 SQL 块通过调用应该返回的SqlCommand.ExecuteNonQuery 方法立即执行:

对于 UPDATE、INSERT 和 DELETE 语句,返回值是受命令影响的行数。

但是我从 ExecuteNonQuery() 返回时得到的是添加到已删除记录数中的更新记录数。所以我的问题是,我能不能让它只返回已删除记录的数量?

4

2 回答 2

3

这行代码 SET NOCOUNT ON,放在存储过程的顶部,关闭 SQL Server 在执行每个 T-SQL 语句后发送回客户端的消息。这是对所有 SELECT、INSERT、UPDATE 和 DELETE 语句执行的。

通过从网络中消除这种额外的开销,它可以大大提高数据库和应用程序的整体性能。

如果您仍然需要获取受正在执行的 T-SQL 语句影响的行数,您仍然可以使用 @@ROWCOUNT 选项。通过在此函数 (@@ROWCOUNT) 上发出 SET NOCOUNT 仍然有效,并且仍然可以在您的存储过程中使用来确定受语句影响的行数。

SET NOCOUNT ON 
SET XACT_ABORT ON;  --Need to roll back upon failure
BEGIN TRANSACTION;  --Need to be performed atomically
UPDATE MyTable SET Col1='SomeValue' WHERE ColID='N';
SET NOCOUNT OFF
DELETE FROM MyTable WHERE ColID='X';
COMMIT;
SET XACT_ABORT OFF;
于 2012-04-30T10:52:17.827 回答
0

好的,我找到了答案。显然这样调用它会重置第一个 ROWCOUNT_BIG() 的行计数器,第二个调用返回删除的数字:

SET XACT_ABORT ON;  --Need to roll back upon failure
BEGIN TRANSACTION;  --Need to be performed atomically
UPDATE MyTable SET Col1='SomeValue' WHERE ColID='N';
SELECT ROWCOUNT_BIG();   --resets rowcount
DELETE FROM MyTable WHERE ColID='X';
SELECT ROWCOUNT_BIG();   --retrieves the needed row count
COMMIT;
SET XACT_ABORT OFF;
于 2012-04-30T05:03:15.867 回答