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打印“你好,世界!”不产生输出。