为什么我们要使用 SET NOCOUNT ON;连同 SELECT @@ROWCOUNT;?

Why do we use the SET NOCOUNT ON; along with the SELECT @@ROWCOUNT;?

我正在通过 here 上的教程学习 EF Core,我遇到了 T-SQL 查询示例中使用的以下语句:

1 SET NOCOUNT ON; 含义(来自here):

Stops the message that shows the count of the number of rows affected by a Transact-SQL statement or stored procedure from being returned as part of the result set.

2 SELECT @@ROWCOUNT; 含义(来自here

Returns the number of rows affected by the last statement.

1和2同时使用。这让我感到困惑。例如,这里:

exec sp_executesql N'SET NOCOUNT ON;
UPDATE [Books] SET [AuthorId] = @p0
WHERE [BookId] = @p1;
SELECT @@ROWCOUNT;
',N'@p1 int,@p0 int',@p1=4,@p0=1

我不明白为什么有人想要在 1 的帮助下关闭 2 的效果,如果可以通过不将它添加到查询中来避免 2 的效果。 IE。以下查询将与上面的查询完全相同:

exec sp_executesql N'UPDATE [Books] SET [AuthorId] = @p0
WHERE [BookId] = @p1;
',N'@p1 int,@p0 int',@p1=4,@p0=1

我是不是遗漏了什么或者同时使用 SET NOCOUNT ONSELECT @@ROWCOUNT 的目的是什么?

SET NOCOUNT ON 停止在控制台(屏幕)上打印 结果。

@@ROWCOUNT 的使用将行计数捕获为 T-SQL 中的参数,并使其可以用于进一步处理。例如,如果没有行更新,您可以使用条件逻辑来执行某些操作。

SET NOCOUNT 经常用于抑制 DONE_IN_PROC TDS 协议消息(行数) SQL 服务器将 return 通过底层 TDS 协议流发送给客户端.这些消息在使用某些 SQL 服务器 API 时可能会导致问题,除非应用程序经过专门编码来处理它们(例如通过调用 ADODB.Recordset.NextRecordSet)以确保执行批处理中的后续语句和结果集 return编辑。因此,使用 SET NOCOUNT ON 已成为 SQL 服务器的常见做法,除非应用程序实际需要行计数。

在您的问题的文档参考中提到的另一个好处是在批处理包含许多 SQL 语句的情况下的性能优势。 SET NOCOUNT 消除了 returning 无论如何都会被丢弃的消息的开销。