【发布时间】:2014-11-02 23:49:55
【问题描述】:
我使用 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;
【问题讨论】:
-
您是否考虑过通过写入日志表而不是依赖客户端字符串输出来检测存储过程?如果您需要自主事务支持,您可以使用环回链接服务器的技巧 (dbbest.com/blog/autonomous-transactions-sql-server)
-
我使用脚本来备份和恢复数百个数据库,并且想要进度输出 printet 而不是记录在表中,因为 BACKUP 和 RESTORE 的进度输出是 printet
-
@NWest 你可以使用
@table变量,它不受事务回滚的影响,不需要各种令人发指的变通办法。
标签: sql sql-server sql-server-2008 tsql raiserror