按照此页的示例,我无法阻止存储过程返回select数据集。
执行此操作:
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上
发布于 2017-09-27 08:33:04
您看到的是SQL服务器输出的错误部分。SELECT/INSERT/UPDATE/DELETE/MERGE操作后,NOCOUNT只控制额外的“行(S)影响”消息,而不是没有指定目的地的任何SELECTs的行集输出。如果将SSMS设置为将输出显示为文本,则可以看到这一点:
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将产生以下产出:
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选项卡中获得以下网格:
(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>将输出放入临时表(然后删除该表或在会话结束时将其删除)以隐藏第一组结果,但这有许多重要的限制:
SELECT <stuff> INTO <newtable> FROM ...的操作,这会添加一段额外的代码(以创建表)INSERT一样,表必须有正确的列数,或者您需要指定目标列,在这两种情况下,它们都必须具有兼容的类型。INSERT <table> EXEC ...不能嵌套,因此如果它可能还使用INSERT <table> EXEC ...的任何依赖项的过程都会中断。关于NOCOUNT的另一点需要注意的是,被调用的存储过程可能会通过使用SET NOCOUNT {ON|OFF}本身来覆盖您指定的设置,因此它可能会忽略您的设置而输出计数,并且您需要在每次调用之后检查/重置它,以确保它是您想要的(关于如何使用@@OPTIONS来检查,请参阅Artashes的答案)。
发布于 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指定的设置在执行或运行时有效,而不是在解析时生效。若要查看此设置的当前设置,请运行以下查询。
DECLARE @NOCOUNT VARCHAR(3) = 'OFF';
IF ( (512 & @@OPTIONS) = 512 ) SET @NOCOUNT = 'ON';
SELECT @NOCOUNT AS NOCOUNT; 您可以阅读更多的这里
https://dba.stackexchange.com/questions/187017
复制相似问题