Answers:
默认情况下,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.
以下将起作用:
sqlcmd -U user -P pass -S Server -Q "sp_who" -r0 1> test.log
查询的输出将被放入日志,并且屏幕上不打印任何内容。
-r1
将所有消息发送到stderr,包括PRINT
和RAISERROR('', 10, 1)
消息。您需要使用-r0
来将那些常规信息消息保留到stdout,以便将它们重定向到test.log。
在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,包括PRINT
和RAISERROR('', 10, 1)
消息。您需要使用-r0
来将那些常规信息消息保留到stdout,以便将它们重定向到install.log。
2> Err.txt
,但是看起来好像SQLCMD
并没有拆分输出。