我使用RAISERROR从存储过程生成进度输出而不是使用PRINT,以避免PRINT缓冲输出。现在我发现RAISERROR将在500次打印后开始缓冲。有办法绕过这种行为吗? 下面的查询将显示我的观点:
DECLARE @i INT = 0
WHILE @i < 50000
BEGIN
SET @i = @i + 1
RAISERROR('%i prints', 0,1 , @i) with nowait;
IF @i > 500 --<--after 500 prints RAISERROR starts buffering 50 prints before flushing.
WAITFOR DELAY '00:00:00.050';
END;
答案 0 :(得分:0)
Erland Sommerskand reported:
但是,请注意Mgmt Studio也会开始缓冲NOWAIT消息 500条消息之后。
SQL附带的旧查询分析器不会发生这种情况 2000
如果您没有可用的QA,也许您可以尝试使用SQLCMD.EXE而不是SSMS。也许它不会在500之后做缓冲。
答案 1 :(得分:0)
我记得在LINQpad中尝试过这个,linqpad可以接受原始的sql,而且没有缓冲区。
我刚试了一次,我可以确认一下。
你能用linqpad吗?