在 SQL Server 的 SQL 语句的一部分中防止记录计数

Posted

技术标签:

【中文标题】在 SQL Server 的 SQL 语句的一部分中防止记录计数【英文标题】:Prevent record count in a part of SQL statement for SQL Server 【发布时间】:2012-05-09 19:53:22 【问题描述】:

我正在使用来自 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 Method 立即执行,应该返回:

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

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

【问题讨论】:

【参考方案1】:

这行代码 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;

【讨论】:

我没有测试它,因为我的方法(发布在下面)对我有用。不过,我仍然会将其标记为答案。所以,如果它没有提到我的帖子,那么......我希望你早点发布它。现在我要花时间重新编码。不过感谢您的建议。【参考方案2】:

好的,我找到了答案。显然这样调用它会重置第一个 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;

【讨论】:

以上是关于在 SQL Server 的 SQL 语句的一部分中防止记录计数的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server:合并语句的更新部分不起作用

SQL Server 数据库部分常用语句小结

SQL Server 数据库部分常用语句小结

SQL Server 数据库部分常用语句小结

Sql Server 事物

使用 rodbc 包从 R 查询 sql server。需要将日期/时间值作为 where 语句的一部分传递到 sqlQuery