使用NOWAIT缓冲的RAISERROR解决方法

时间:2014-09-09 14:01:25

标签: sql sql-server sql-server-2008 tsql raiserror

我使用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; 

2 个答案:

答案 0 :(得分:0)

Erland Sommerskand reported

  

但是,请注意Mgmt Studio也会开始缓冲NOWAIT消息   500条消息之后。

     

SQL附带的旧查询分析器不会发生这种情况   2000

如果您没有可用的QA,也许您可​​以尝试使用SQLCMD.EXE而不是SSMS。也许它不会在500之后做缓冲。

答案 1 :(得分:0)

我记得在LINQpad中尝试过这个,linqpad可以接受原始的sql,而且没有缓冲区。

我刚试了一次,我可以确认一下。

你能用linqpad吗?