2008-10-17 133 views
21

在存储过程中,另一个存储过程在游标内被调用。对于每次调用,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 

谢谢!

+0

你确定你需要使用游标吗?目前这些不应该是SQL Server的首选。事实上,许多专家都厌恶他们。 – DOK 2008-10-17 16:37:36

+0

请在这里发布您收到的错误。 – 2008-10-17 18:32:25

回答

14

,你可以将结果插入到一个临时表,然后删除临时表

create table #tmp (columns) 

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

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

•在查询窗口
•选择“查询选项”
•单击“结果”右键单击:

+0

我正在重新使用web应用程序使用的可重用导入程序,所以我无法更改proc的任何行为。这只是件事。 – 2017-04-05 21:00:20

0

地点:

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

包装,围绕内部SP,或者你甚至可以做到这一点从周围原始查询的SELECT语句,这将防止出现结果。

+0

我试过但收到错误。我也尝试过绕过SET ROWCOUNT 1和SET ROWCOUNT 0,但没有成功。 – 2008-10-17 15:46:54

+0

我相信这适用于SQL Server 2005及更高版本。如果您使用的是SQL 2000,请参阅Estanislao的回复。 – RLH 2011-10-18 14:56:56

+2

SET ROWCOUNT的语法是 SET ROWCOUNT {number | @number_var}。它不会将ON/OFF作为参数。 – Tony 2014-10-18 22:33:44

29

您可以通过以下步骤,2005年 丢弃在SQL Server管理Studio中的结果集在左侧面板树视图“节点”的形式中心/右
•检查“放弃执行后的结果”

,您可以尝试在

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

3

光标坏。如果这意味着您必须使用游标执行基于集合的函数,则不要重用存储的proc代码。更好的性能是以基于集合的方式编写代码。

我想我担心你更关心抑制消息,而不是你在游标中出现错误。

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(或菜单查询 - >结果 - >结果到文本)以强制输出为纯文本而不是表格式记录集。你最终会达到另一个限制(结果窗口不能处理无限的文本输出),但它会更大。

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

9

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