从存储过程执行存储过程时如何禁用查询结果?

时间:2008-10-17 15:30:41

标签: sql-server stored-procedures cursors

在存储过程中,在游标中调用另一个存储过程。对于每个调用,SQL Management Studio结果窗口都显示结果。光标循环超过100次,此时结果窗口放弃了错误。有没有办法可以阻止光标中的存储过程输出任何结果?

  WHILE @@FETCH_STATUS = 0
  BEGIN
    EXEC @RC = dbo.NoisyProc
    SELECT @RValue2 = 1 WHERE @@ROWCOUNT = 0
    FETCH NEXT FROM RCursor INTO @RValue1, @RValue2
  END

谢谢!

7 个答案:

答案 0 :(得分:31)

您可以在SQL Server Mgmt Studio 2005中丢弃结果集 按照以下步骤操作:

•在查询窗口中单击鼠标左键·选择“查询选项”
•单击左侧面板树视图中的“结果”“节点”
•选中“执行后丢弃结果”在表格的中间/右侧

你可以试试

DECLARE @i int
SET @i = 1
WHILE (@i <= 100)
  BEGIN
    SELECT @i as Iteration
    SET @i = @i + 1
  END

答案 1 :(得分:14)

您可以将结果插入临时表,然后删除临时表

create table #tmp (columns)

while
    ...
    insert into #tmp exec @RC=dbo.NoisyProc
    ...
end
drop table #tmp

否则,你可以修改被调用的proc来接受一个告诉它不输出结果集的标志吗?

答案 2 :(得分:9)

我知道这个问题很旧,但您可以设置SET NOCOUNT ON以防止SP为每一行输出消息。

答案 3 :(得分:3)

游标不好。如果这意味着您必须使用游标执行基于集合的功能,请不要重复使用存储的proc代码。以基于set-nbased的方式编写代码更好的性能。

我认为我担心你更关心压制消息而不是光标中有错误。

答案 4 :(得分:1)

错误可能来自返回的记录集太多,而不是SP或光标本身的逻辑缺陷。看看这个例子:

DECLARE @I INT
SET @I=0
WHILE @I<200 BEGIN
    SELECT * FROM INFORMATION_SCHEMA.TABLES
    SET @I = @I + 1
END

将运行多次(略多于100次)然后失败:

  

查询已超出结果网格中可显示的最大结果集数。网格中仅显示前100个结果集。

SSMS对它可以显示的记录集数量有限制。 绕过该限制的一种快速方法是按Ctrl + T(或菜单Query-&gt; Results to-&gt; Results to Text)以强制输出为纯文本,而不是类似于表的记录集。你最终会达到另一个限制(结果窗口无法处理无限量的文本输出)但它会更大。

在上面的示例中,在将结果更改为文本形式后,您不会收到错误!

答案 5 :(得分:1)

此页面很旧,回复也很旧。但是,最好的答案还没有被推到最高位置。我想这是因为没有提供足够的解释。

使用NOCOUNT设置。每个人都应该查看NOCOUNT设置。默认设置为“关闭”。

即使在新数据库上也普遍更改此设置的默认设置,可能会使某些编码人员/用户感到困惑。我建议在更改之前先捕获设置,然后再重新设置。这在下面的示例脚本中显示,该脚本演示了NOCOUNT设置的使用。

这是一篇好文章。 https://www.sqlshack.com/set-nocount-on-statement-usage-and-performance-benefits-in-sql-server/

DROP TABLE IF EXISTS TestTable
GO
CREATE TABLE TestTable (ID INT, TestText VARCHAR (40))
GO

-- Get the Original NOCOUNT setting and save it to @OriginalNoCountSettingIsOn
DECLARE @options INT
SET @options = @@OPTIONS
DECLARE @OriginalNoCountSettingIsOn AS bit
SET @OriginalNoCountSettingIsOn = IIF(( (512 & @@OPTIONS) = 512 ),1,0)

-- Now set NOCOUNT ON to suppress result output returned from INSERTS 
-- Note - this does not affect @@ROWCOUNT values from being set 
SET NOCOUNT ON --  <---- Try running script with SET NOCOUNT ON and SET NOCOUNT OFF to See difference

INSERT INTO TestTable (ID, TestText)
VALUES  (0, 'Test Row 1')

INSERT INTO TestTable (ID, TestText)
VALUES  (0, 'Test Row 2'),
        (0, 'Test Row 3'),
        (0, 'Test Row 4')

INSERT INTO TestTable (ID, TestText)
VALUES  (0, 'Test Row 5')

/*Now set NOCOUNT back to original setting*/
IF @OriginalNoCountSettingIsOn = 1 
BEGIN
    SET NOCOUNT ON
END
ELSE
BEGIN
    SET NOCOUNT OFF
END 

DROP TABLE IF EXISTS TestTable
GO

答案 6 :(得分:0)

地点:

SET ROWCOUNT OFF
/* the internal SP */
SET ROWCOUNT ON

将它包装在内部SP周围,或者你甚至可以在原始查询的SELECT语句周围进行,这将阻止结果出现。