【发布时间】:2014-01-03 17:30:52
【问题描述】:
我的部署服务器为每个新的数据库构建运行一个部署脚本。
部分脚本阻塞等待另一个异步操作完成。
阻塞代码如下所示:
DECLARE @i INT = 0;
DECLARE @laststatus NVARCHAR(MAX) = N'';
WHILE @i < 5
BEGIN
-- the real delay is longer
WAITFOR DELAY '00:00:01';
-- poll async operation status here
SET @i = @i + 1;
SET @laststatus = N'status is ' + CAST(@i AS NVARCHAR(MAX));
RAISERROR(@laststatus, 0, 1) WITH NOWAIT;
END;
它使用RAISERROR 的WITH NOWAIT 子句而不是PRINT,因为它应该为每次迭代打印一个状态更新。
部署服务器使用以下命令在 sqlcmd 中运行脚本:
sqlcmd.exe -i print_test.sql
输出立即显示如下:
状态为 1
状态为 2
状态为 3
状态为 4
状态为 5
它应该在一秒钟后打印:
状态为 1
再过一秒钟,它应该会打印出来
状态为 2
等等。
有没有办法在 sqlcmd 中做到这一点?
【问题讨论】:
-
对我来说很好。您是否在 SSMS 中运行此程序?如果是这样,您是否在查询开始运行后立即单击消息选项卡?只有在查询停止执行时才会自动设置焦点。
-
顺便说一句,您也可以在没有中间变量的情况下执行
RAISERROR(N'status is %i', 0, 1, @i) WITH NOWAIT;。 -
@MartinSmith 你说得对 SSMS。我需要在 sqlcmd 中发生同样的事情。只是注意到他们在这里对我来说表现不同!编辑问题以澄清。