首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我们使用SELECT @ROWCOUNT和SELECT@ROWCOUNT;?

为什么我们使用SELECT @ROWCOUNT和SELECT@ROWCOUNT;?
EN

Stack Overflow用户
提问于 2019-11-11 20:31:25
回答 2查看 1.7K关注 0票数 1

我正在通过EF通过这里上的教程学习,并在the查询的示例中看到了以下语句:

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

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

2 SELECT @@ROWCOUNT;含义(来自这里)

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

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

代码语言:javascript
复制
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的效果。例如,以下查询将与上面的查询完全相同:

代码语言:javascript
复制
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的目的是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-11 20:34:42

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

使用@@ROWCOUNT将行计数捕获为to中的一个参数,并使使用它进行进一步处理成为可能。例如,如果没有更新任何行,则可以使用条件逻辑来执行某些操作。

票数 6
EN

Stack Overflow用户

发布于 2019-11-12 01:01:41

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

在您的问题中的doc引用中提到的另一个好处是,在批处理包含许多SQL语句的情况下,性能上的好处。SET NOCOUNT消除了返回将被丢弃的消息的开销。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58808302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档