首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Server:在仍然返回数据时设置NOCOUNT

Server:在仍然返回数据时设置NOCOUNT
EN

Database Administration用户
提问于 2017-09-27 07:59:20
回答 2查看 9.8K关注 0票数 2

按照此页的示例,我无法阻止存储过程返回select数据集。

执行此操作:

代码语言:javascript
复制
SET NOCOUNT OFF;
GO
-- Display the count message.
SELECT 'should be displayed'
GO
-- SET NOCOUNT to ON to no longer display the count message.
SET NOCOUNT ON;
GO
SELECT 'should NOT be displayed'
GO
-- Reset SET NOCOUNT to OFF
SET NOCOUNT OFF;
GO

会把这个还给我:

这是个虫子吗?有什么问题吗?我在Server 13.0.4206上

EN

回答 2

Database Administration用户

回答已采纳

发布于 2017-09-27 08:33:04

您看到的是SQL服务器输出的错误部分。SELECT/INSERT/UPDATE/DELETE/MERGE操作后,NOCOUNT只控制额外的“行(S)影响”消息,而不是没有指定目的地的任何SELECTs的行集输出。如果将SSMS设置为将输出显示为文本,则可以看到这一点:

代码语言:javascript
复制
SET NOCOUNT OFF
SELECT test='NoCount is OFF'
SET NOCOUNT ON
SELECT test='NoCount is ON'
SET NOCOUNT OFF
SELECT test='NoCount is OFF again'
-- now lets try with operations that store the rowset instead of sending as output
SET NOCOUNT OFF
PRINT 'A rows affected count should follow'
SELECT test='NoCount is OFF' INTO #temptable
SET NOCOUNT ON
PRINT 'But there won''t be one for this statement'
SELECT test='NoCount is ON' INTO #temptable2
SET NOCOUNT OFF
PRINT 'A rows affected count should follow'
SELECT test='NoCount is OFF again' INTO #temptable3

将产生以下产出:

代码语言:javascript
复制
test
--------------
NoCount is OFF

(1 row(s) affected)

test
-------------
NoCount is ON

test
--------------------
NoCount is OFF again

(1 row(s) affected)

A rows affected count should follow

(1 row(s) affected)
But there won't be one for this statement
A rows affected count should follow

(1 row(s) affected)

或者,如果将SSMS设置为在网格中显示输出,则将在结果选项卡中获得网格,并在messages选项卡中获得以下网格:

代码语言:javascript
复制
(1 row(s) affected)

(1 row(s) affected)
A rows affected count should follow

(1 row(s) affected)
But there won't be one for this statement
A rows affected count should follow

(1 row(s) affected)

据我所知,无法阻止希望输出所有行集的存储过程输出所有行集。

您可以使用表单INSERT <table> EXEC <procedure> <params>将输出放入临时表(然后删除该表或在会话结束时将其删除)以隐藏第一组结果,但这有许多重要的限制:

  1. 该表必须已经存在,您不能执行相当于SELECT <stuff> INTO <newtable> FROM ...的操作,这会添加一段额外的代码(以创建表)
  2. 与任何其他INSERT一样,表必须有正确的列数,或者您需要指定目标列,在这两种情况下,它们都必须具有兼容的类型。
  3. INSERT <table> EXEC ...不能嵌套,因此如果它可能还使用INSERT <table> EXEC ...的任何依赖项的过程都会中断。
  4. 它只能捕获一个结果集,因此如果被调用的过程返回多个结果集,则不能按您的要求工作。

关于NOCOUNT的另一点需要注意的是,被调用的存储过程可能会通过使用SET NOCOUNT {ON|OFF}本身来覆盖您指定的设置,因此它可能会忽略您的设置而输出计数,并且您需要在每次调用之后检查/重置它,以确保它是您想要的(关于如何使用@@OPTIONS来检查,请参阅Artashes的答案)。

票数 14
EN

Database Administration用户

发布于 2017-09-27 08:15:02

SET NOCOUNT (Transact-SQL)

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

当设置为NOCOUNT时,计数不返回。当SET NOCOUNT为OFF时,将返回计数。即使设置为NOCOUNT,@@ROWCOUNT函数也会更新。设置NOCOUNT可以防止为存储过程中的每个语句向客户端发送DONE_IN_PROC消息。对于包含几个不返回大量实际数据的语句的存储过程,或者对于包含Transact-SQL循环的过程,将SET NOCOUNT设置为ON可以提供显著的性能提升,因为网络通信量大大减少。setting指定的设置在执行或运行时有效,而不是在解析时生效。若要查看此设置的当前设置,请运行以下查询。

代码语言:javascript
复制
DECLARE @NOCOUNT VARCHAR(3) = 'OFF';  
IF ( (512 & @@OPTIONS) = 512 ) SET @NOCOUNT = 'ON';  
SELECT @NOCOUNT AS NOCOUNT;  

您可以阅读更多的这里

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

https://dba.stackexchange.com/questions/187017

复制
相关文章

相似问题

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