【问题标题】:Why do we use the SET NOCOUNT ON; along with the SELECT @@ROWCOUNT;?为什么我们使用 SET NOCOUNT ON;连同 SELECT @@ROWCOUNT;?
【发布时间】:2019-11-11 20:31:25
【问题描述】:

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

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

停止显示受 Transact-SQL 语句或存储过程影响的行数的消息作为结果集的一部分返回。

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

返回受最后一条语句影响的行数。

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

如果可以通过不将 2 添加到查询中来避免 2 的影响,我不明白为什么有人要在 1 的帮助下关闭 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 - 停止显示受 Transact-SQL 语句或存储过程影响的行数作为结果集的一部分返回的消息。 @@ROWCOUNT - 返回受最后一条语句影响的行数。一个不依赖于另一个。 WHEN NOCOUNT IS ON 生成的消息可能会使用@@ROWCOUNT。

标签: sql-server entity-framework tsql entity-framework-core rowcount


【解决方案1】:

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

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

【讨论】:

  • 这是否意味着我在问题中提供的示例中的两个语句的使用没有任何目的,只是一个习惯问题?
  • @qqqqqqq 。 . .通常,人们不希望打印无关的消息。如果您运行 update 并收到来自触发器的消息,或者您运行存储过程并开始出现计数,这可能会令人困惑。
  • 好的,这就解释了为什么一直使用SET NOCOUNT ON。但是@@ROWCOUNT 呢?
  • @qqqqqqq 。 . .当代码中需要该值时使用该值。坦率地说,建议使用output 子句来捕获有关修改的行的信息,这可能是获取行数的更安全的方法(尽管为了方便仍使用@@ROWCOUNT)。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2010-12-01
    • 2015-06-23
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    • 2012-05-30
    • 2013-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多