我的部署服务器为每个新的数据库构建运行一个部署脚本。
部分脚本会阻塞以等待另一个异步操作完成。
阻塞代码如下所示:
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;
它使用WITH NOWAIT
的条款RAISERROR
代替PRINT
因为它应该为每次迭代打印状态更新。
部署服务器使用以下命令在 sqlcmd 中运行脚本:
sqlcmd.exe -i print_test.sql
输出同时出现,如下所示:
状态为 1
状态为 2
状态为 3
状态为 4
状态为 5
它应该在一秒钟后打印:
状态为 1
再过一秒它应该打印这个
状态为 2
等等。
有没有办法在 sqlcmd 中做到这一点?
有没有办法在 sqlcmd 中做到这一点?
据我所知还没有。
Connect 上已经对此进行了报道。看SQLCMD11 中不支持 RAISERROR WITH NOWAIT
SQLCMD 在 SQL 2012 中被重写以使用 ODBC。这里有一个小
似乎已经潜入的回归错误。如果您使用脚本
它使用 RAISERROR WITH NOWAIT,但输出仍然被缓冲。
这可以与 SQL 2008 中的 OSQL 和 SQLCMD 正常配合使用。
但目前尚未修复。
我想你可以添加一个SELECT
作为解决方法,您可以调整网络数据包大小(或增加现有消息大小)来刷新缓冲区。
例如
DECLARE @i INT = 0;
WHILE @i < 5
BEGIN
-- poll async operation status here
SET @i = @i + 1;
PRINT 'status is ' + CAST(@i AS VARCHAR(10)) + SPACE(4000);
WAITFOR DELAY '00:00:01';
END;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)