众所周知,SSMS(或者可能是 SQL Server,但我猜更多的 SSMS)会延迟PRINT
消息,直到缓冲区中收集了几行(40),然后才真正打印到 SSMS 中的消息窗口(例外:打印出其他内容,例如受 UPDATE 影响的行数或批处理完成)。
所以我通常使用RAISEERROR(<text>, 0, 0) WITH NOWAIT
立即打印出来。这适用于前 500 行,在此 SSMS 似乎再次开始缓冲它们之后(50 行,从 1000 行开始,缓冲区似乎增加到 1000)。
有谁知道,我如何防止这种“缓冲功能”(例如,如果我通过使用 Ola Hallengreens 维护解决方案手动运行统计更新,我更想知道它目前真正做了什么而不必使用 sp_whoisactive 等。 )。
PS:您可以使用以下“脚本”来模拟此行为
DECLARE @i INT = 0
WHILE @i < 10000
BEGIN
SET @i += 1
RAISERROR('Step %i', 0, 0, @i) WITH NOWAIT
--PRINT @i
WAITFOR DELAY '00:00:01.0' -- wait 1 second, feel free to decrease
END
要完全控制消息显示,您可以使用 System.Data.SqlClient 使用 PowerShell 执行脚本,处理 InfoMessage 事件并在连接上设置 FireInfoMessageEventOnUserErrors。我认为没有办法控制 SSMS 或其他 SQL Server 工具中的行为。——丹·古兹曼昨天