Sql server 2012 我可以为循环中的每个迭代立即打印吗?
我的部署服务器为每个新的数据库构建运行一个部署脚本 部分脚本块等待另一个异步操作完成 阻塞代码如下所示:Sql server 2012 我可以为循环中的每个迭代立即打印吗?,sql-server-2012,sqlcmd,Sql Server 2012,Sqlcmd,我的部署服务器为每个新的数据库构建运行一个部署脚本 部分脚本块等待另一个异步操作完成 阻塞代码如下所示: 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 +
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;
输出一次显示如下:
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;
状态为1
状态是2
状态是3
状态是4
状态是5
它应在一秒钟后打印:
状态为1
再过一秒钟,它就会打印出这个
状态是2
等等
在sqlcmd中是否有这样做的方法
在sqlcmd中是否有这样做的方法
据我所知不是这样
已在Connect上报告了此问题。看
SQLCMD在SQL 2012中重写为使用ODBC。这是一个小盒子
似乎潜入的回归错误。如果你有剧本
在NOWAIT中使用RAISERROR时,输出仍然会被缓冲。
这适用于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;
您可以使用。虽然它已被弃用,但它的工作原理与您所期望的一样
等效命令为:
osql -E -n -i print_test.sql
osql默认需要用户名和密码。使用-E开关可使用Windows身份验证。这与sqlcmd默认行为相反
osql默认为输入文件脚本中的每一行打印一个数字
1> 2>3>4>5>6>7>8>9>10>11>12>13>14>15>
使用-n开关抑制行号
sqlcmd没有-n开关。设置-i开关时,它只是不打印行号
马丁·史密斯引述了关于这个问题的最新消息,引导我找到了解决办法
如果使用NOWAIT时使用RAISERROR的脚本,输出仍然会被缓冲。这适用于SQL 2008中的OSQL和SQLCMD
我也遇到了这个问题,初步使用您的示例,powershell cmdlet invoke-sqlcmd似乎没有同样的问题 因此,如果您可以将部署服务器切换为调用powershell脚本,这可能是一个选项 但是,与sqlcmd相比,invoke sqlcmd存在一些限制,因此请检查文档。您的里程可能会有所不同
使用powershell还可以简化sqlcmdvariable提供方法,这有点麻烦。。虽然通常我现在已经解决了这个问题,所以我要再次打破它。对我来说很好。你在SSMS中运行这个吗?如果是这样,您是否在查询开始运行后立即单击messages选项卡?焦点仅在查询停止执行时自动设置。顺便说一句,您还可以使用NOWAIT执行RAISERRORN'状态为%i',0,1,@i;没有中间变量。@MartinSmith关于SSMS,你是对的。我需要在sqlcmd中发生同样的事情。只是注意到他们在这里对我的行为不同!编辑该问题以澄清问题。我还没有测试该变通方法在sqlcmd中是否有效。我想您可以尝试发送越来越多的数据,但它可能只是被编码为在执行完成之前不显示输出。将输出填充为大于网络数据包大小对我不起作用。用SELECT替换PRINT也不起作用。看起来sqlcmd会缓冲所有数据包,直到批处理结束。不过,osql可以工作!请参阅。Microsoft于2013年4月24日10:48发布。感谢您的反馈!我们将在未来的计划中考虑到这一点,他们想知道我为什么讨厌他们,似乎powershell的Invoke SqlCmd工作正常,与osql一样。或者,另一种解决方法是在sqlcmd模式下使用SSMS,这取决于最初希望使用sqlcmd的动机。@MartinSmith该脚本设计为在我的部署服务器上运行,由新的数据库构建触发。这里我只能使用命令行工具。我再次编辑了这个问题以澄清上下文。谢谢我将此标记为已接受,因为它对我有效。我以后会改用PowerShell。osql不支持用sqlcmd参数替换sql文件中的一些位,所以对我来说不太好,但无论如何,谢谢你们能在PowerShell中提供一个例子吗?我的Invoke-Sqlcmd版本似乎完全忽略了打印语句。调用Sqlcmd-Query打印“你好,世界!”不产生输出。