如何使SQLCMD仅输出错误和警告?


8

在执行SQL脚本文件时,如何获取SQLCMD来仅输出遇到的任何错误或警告?

我基本上不希望基于信息的消息被输出。


嗯,在另一个应用程序中,我们可以使用重定向错误输出2> Err.txt,但是看起来好像SQLCMD并没有拆分输出。
所有行业的乔恩2012年

2
@JonofAllTrades默认情况下,SQLCMD将所有输出发送到stdout。但是,您可以指示SQLCMD 通过命令行开关将错误发送到stderr-r0,在这种情况下,可以使用将该错误重定向到文件2>,或者在通过重定向常规消息时可以显示错误>。请查看我的答案以获取详细信息。
所罗门·鲁兹基

Answers:


4

默认情况下,SQLCMD将所有非错误消息和错误消息发送到stdout。因此,尝试重定向输出将无济于事。

为了仅获取一种或另一种类型的消息(错误或非错误),您需要做的第一件事是告诉SQLCMD通过将错误消息(严重级别为11或更高)发送到stderr来分离它们。您可以通过使用-r命令行开关(指定0为该开关的选项-r0)(即)来执行此操作。此时,就运行SQLCMD和查看屏幕上显示的任何类型的消息而言,没有明显的区别。

下一部分将过滤掉发送到stdout的常规消息。可以通过将stdout消息重定向到某个位置(通过>哪里)来实现?您可以这样做> file.txt,但我怀疑您想要不要使用的消息文件。幸运的是,DOS具有与Unix中类似的NUL关键字(不是 typeo:它有一个L,而不是两个)/dev/null。意味着您可以使用以下命令将输出重定向到无处:> NUL

以下将执行PRINT命令,并且不显示任何输出,因为不会生成任何错误,也不会创建包含该PRINT命令的输出的文件:

CD %TEMP%

SQLCMD -E -Q "print 1;" -r0 > NUL

但是以下显示错误消息,因为这些消息未重定向到NUL

CD %TEMP%

SQLCMD -E -Q "print a;" -r0 > NUL

返回值:

Msg 128, Level 15, State 1, Server DALI, Line 1
The name "a" is not permitted in this context. Valid expressions are constants,
constant expressions, and (in some contexts) variables. Column names are not permitted.

1

以下将起作用:

sqlcmd -U user -P pass -S Server -Q "sp_who" -r0 1> test.log

查询的输出将被放入日志,并且屏幕上不打印任何内容。

有关sqlcmdMSDN文章的更多详细信息。


根据请求的“我本质上不希望输出基于信息的消息 ”,这实际上不起作用(我的重点是)。问题是-r1所有消息发送到stderr,包括PRINTRAISERROR('', 10, 1)消息。您需要使用-r0来将那些常规信息消息保留到stdout,以便将它们重定向到test.log
所罗门·鲁兹基

1
@srutzky谢谢,修改了我的答案以反映您的评论。
LowlyDBA 2015年

0

在SQLServerCentral上找到了这个

sqlcmd -E -i"install.sql" -r1 2> install-err.log 1> install.log

http://www.sqlservercentral.com/Forums/Topic536968-146-1.aspx


根据请求的“我本质上不希望输出基于信息的消息 ”,这实际上不起作用(我的重点是)。问题是-r1所有消息发送到stderr,包括PRINTRAISERROR('', 10, 1)消息。您需要使用-r0来将那些常规信息消息保留到stdout,以便将它们重定向到install.log
所罗门·鲁兹基
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.