【问题标题】:How do I disable query results when executing a stored procedure from a stored procedure?从存储过程执行存储过程时如何禁用查询结果?
【发布时间】:2008-10-17 15:30:40
【问题描述】:

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

谢谢!

【问题讨论】:

  • 您确定需要使用光标吗?这些天不应该是 SQL Server 的首选。事实上,许多专家都厌恶它们。
  • 请在此处发布您收到的错误。

标签: sql-server stored-procedures cursors


【解决方案1】:

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

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

你可以试试

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

【讨论】:

  • 这应该是公认的答案 - 这是 SSMS 选项,可以完全按照原始发帖人的要求进行操作
【解决方案2】:

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

create table #tmp (columns)

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

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

【讨论】:

  • 我正在重新使用 Web 应用程序使用的 proc 来进行可重用的导入过程,因此我无法更改 proc 的任何行为。就是这样。
【解决方案3】:

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

【讨论】:

  • 谢谢谢谢谢谢!这是 SQL 2000 的确切答案。我假设 Adam 的答案适用于 SQL 2005+。
  • NOCOUNT 很好,因为它可以防止显示结果的数量,但是 6eorge Jetson/Robert Koritnik 排除了显示额外的结果集(我认为原来的问题是什么)?跨度>
【解决方案4】:

光标不好。如果这意味着您必须使用游标执行基于集合的函数,请不要重用存储的过程代码。以基于集合的方式编写代码可以提高性能。

我想我担心的是你更关心抑制消息而不是光标中有错误。

【讨论】:

  • 你是对的——虽然我在这里受到限制。出于支持原因,我无法更改存储过程,因为它属于第三方。
【解决方案5】:

错误可能来自返回的记录集过多,而不是您的 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->Results to->Results to Text)以强制输出为纯文本,而不是类似表格的记录集。您最终会达到另一个限制(结果窗口无法处理无限量的文本输出)但它会更大。

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

【讨论】:

    【解决方案6】:

    这个页面很旧,回复也很旧。但是,最好的答案并没有被投票给顶部。我想是因为没有提供足够的解释。

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

    即使在新数据库上也普遍更改 this 的默认设置,可能会导致某些编码人员\用户感到困惑。我建议使用在更改设置之前捕获设置,然后将其设置回来的方法。这在下面的示例脚本中显示,该脚本演示了 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
    

    【讨论】:

      【解决方案7】:

      地点:

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

      将其包裹在内部 SP 周围,或者您甚至可以围绕原始查询中的 SELECT 语句执行此操作,这将阻止结果出现。

      【讨论】:

      • 我试过但收到错误。我还尝试将它包裹在 SET ROWCOUNT 1 和 SET ROWCOUNT 0 周围,但没有成功。
      • 我相信这适用于 SQL Server 2005 及更高版本。如果您使用的是 SQL 2000,请参阅 Estanislao 的回复。
      • SET ROWCOUNT 的语法是 SET ROWCOUNT {number|@number_var}。它不以 ON/OFF 作为参数。
      猜你喜欢
      • 2014-06-15
      • 2010-10-10
      • 1970-01-01
      • 1970-01-01
      • 2018-12-27
      • 1970-01-01
      • 2011-11-07
      • 2015-11-20
      • 1970-01-01
      相关资源
      最近更新 更多