如何使用 nowait 使 raiserror 与 sqlcmd 一起工作?

mar*_*ark 2 sql-server sqlcmd sql-server-2012

这是命令行:

sqlcmd -S localhost -U myuser -P mypwd -b -r0 -Q "raiserror('hello',10,1) with nowait;waitfor delay '00:00:10';raiserror('world!',10,1) with nowait"
Run Code Online (Sandbox Code Playgroud)

它应该立即输出hello,然后在 10 秒后输出world!. 不幸的是,它会在 10 秒后输出两个字符串。

sqlcmd 可以做对吗?如何?

聚苯乙烯

我不想为此使用 LinqPad 或任何 GUI。

小智 5

我意识到这是一篇旧帖子,很有可能没有人会看到我的答案,但我会提供我们在我的组织中所做的一些事情。我将是第一个承认这有点混乱的人,但它对我们来说一直运作良好。

我们有通过 SQLCMD 调用的进程,它们使用 Raiserror 来指示进度条目。显然,当我们很久以前升级到 Sql 2012 时,这不再有效。

我最终在 C 驱动器上创建了一个名为 c:\Sql2008_SQLCMD 的新目录,并将以下两个文件从 Sql Server binn 文件夹的 Sql 2008 安装复制到该文件夹​​。

  • 命令行命令
  • SQLCMD文件

然后我修改了我的进程(在 bat 文件中)以使用这样的 dos 变量

SET SQLCMD="C:\Sql2008_SQLCMD\sqlcmd"
Run Code Online (Sandbox Code Playgroud)

然后我用 bat 文件替换了任何普通的 SQLCMD 命令行

%SQLCMD% -S 等等...

而不是正常的

SQLCMD -S 等等

这种技术使我能够调用 SQLCMD 的 SQL 2008 版本,对我的 bat 文件脚本进行最少的更改。

这让我可以继续查看 Raiserror 的输出,以便我可以查看进程的进度。

我目前仍在 Sql 2016 CU3 下使用此技术 - 我不确定当我们最终转到 Sql 2017 或以后是否会遇到任何问题