3

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

2 回答 2

0

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

我又试了一次,我可以确认。

你可以使用 linqpad 吗?

于 2014-09-09T14:19:22.430 回答
0

Erland Sommerskand报道

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

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

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

于 2014-09-09T14:07:44.423 回答