【问题标题】:How to return partial result of a procedure during its calculation?如何在计算过程中返回过程的部分结果?
【发布时间】:2020-05-10 19:57:38
【问题描述】:

如何在 MS SQL 计算过程中返回过程的部分结果?假设由于waitfor delay 或内部有一个巨大的查询,计算一个过程需要很多时间。但我想显示在整个过程结束之前已经计算的结果。

在下面的示例中,我希望在 5 秒过去之前看到“1”作为部分结果,我可以看到“2”作为最终结果。

CREATE PROCEDURE #Proc
AS
BEGIN
    SELECT 1 AS PartialResult;

    WAITFOR DELAY '00:00:05'

    SELECT 2 AS FinalResult;
END;

EXEC #Proc;

【问题讨论】:

  • 这能回答你的问题吗? Yield Return equivalent in SQL Server
  • SQL 不是这样工作的。如果 SP 很慢,也许您需要对其进行性能调整。
  • @Cid,我不这么认为。我希望同时看到 1 和 2,只是我希望在 2 开始计算之前看到 1。
  • @musialmi 然后将其拆分为 2 个过程,并调用第一个,然后调用第二个
  • 为什么要这样做?这是向应用程序呈现数据吗?如果是这样,您可以查看分页,因此您不会返回这么大的集合。

标签: sql-server


【解决方案1】:

添加RAISERROR('',0,1) WITH NOWAIT; 以在延迟前将缓冲区刷新到客户端。

CREATE PROCEDURE #Proc
AS
BEGIN
    SELECT 1 AS PartialResult;

    RAISERROR('',0,1) WITH NOWAIT;

    WAITFOR DELAY '00:00:05'

    SELECT 2 AS FinalResult;
END;

【讨论】:

  • 这很好用,谢谢!但是,如果可以将 1 打印给用户并返回 2 作为最终结果,以便我可以运行 INSERT INTO #Table EXEC #Proc 并同时看到 1 并将 2 保存到#Table 中,我会很感兴趣。很抱歉我没有早点写。
  • @musialmi - 你需要PRINT 1 而不是SELECT 1
  • @musialmi:在多行的情况下,您不能直接打印查询结果,也不能“显示”结果集,但实际上不能将其“返回”给客户端以进行调试。如果您需要类似的东西,则必须将结果完全插入到另一个表中并从另一个会话中检查。这样的操作不是免费的,所以如果它只是为了调试,你会想在生产中禁用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-14
  • 1970-01-01
  • 2012-07-11
  • 2016-04-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多