gpt4 book ai didi

sql - RAISERROR AND NOWAIT 不是那么直接吗?

转载 作者:行者123 更新时间:2023-12-03 01:54:34 25 4
gpt4 key购买 nike

我之前问过一个关于如何执行 PRINT 的问题,以便在脚本的其余部分仍在运行时立即提供输出(请参阅: How to see progress of running SQL stored procedures? )。简单的答案是使用:

RAISERROR ('My message', 0, 1) WITH NOWAIT

但是,我注意到返回的输出并不总是立即的,特别是当它返回大量结果时。作为一个简单的实验,请考虑以下脚本:

DECLARE @count INT
SET @count = 1

WHILE @count <= 5000
BEGIN
RAISERROR ('Message %d', 0, 1, @count) WITH NOWAIT
WAITFOR DELAY '00:00:00.01'
SET @count = @count + 1
END

上面的脚本将输出 5000 行文本。如果运行该脚本,您会注意到:

  • 对于前 500 行(1 - 500 行),它会立即返回每个输出行。
  • 对于接下来的 500 行(501 - 1000 行),它每 50 行返回一次输出。 (所有 50 行将被一起批处理,并仅在每 50 行末尾返回。)
  • 对于此后的每一行(1001 - * 行),它每 100 行返回一次输出。 (所有 100 行将被一起批处理,并仅在每第 100 行末尾返回。)

这意味着在前 500 行之后,RAISERROR WITH NOWAIT 不再按预期工作,并且会给我带来问题,因为我想查看长时间运行的脚本的进度。

所以我的问题:有什么方法可以禁用这种“批量”行为并使其始终立即返回?

<小时/>

编辑:我正在使用 SSMS (SQL Server Management Studio) 运行上述脚本。它似乎会影响所有版本(SSMS 和 SQL Server),并且输出设置为“结果到文本”还是“结果到网格”没有区别。

编辑:显然,这种批处理行为发生在 500 行之后,无论有多少字节。因此,我相应地更新了上面的问题。

编辑:感谢Fredou指出这是 SSMS 的问题,而 LinqPad 等第三方工具不会出现此问题.

但是,我发现当输出中有表结果时,LinqPad 也不会立即输出。例如,考虑以下代码:

RAISERROR ('You should see this immediately', 0, 1) WITH NOWAIT
SELECT * FROM master.sys.databases
RAISERROR ('You should see this immediately too, along with a table above.', 0, 1) WITH NOWAIT
WAITFOR DELAY '00:00:05'
RAISERROR ('You should see this 5 seconds later...', 0, 1) WITH NOWAIT

当您在 LinqPad 中运行上述脚本时,仅立即输出第一行。剩下的5秒后才会输出...

那么,有人知道 SSMS 的一个很好的轻量级替代方案吗?它是免费的,不需要安装,并且可以与 RAISERROR WITH NOWAIT 的立即输出与表结果混合使用?

最佳答案

如果您将结果设置为文本,这似乎在 2008R2 中有效。 enter image description here

关于sql - RAISERROR AND NOWAIT 不是那么直接吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22824742/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com