【发布时间】:2012-06-28 11:04:45
【问题描述】:
如何让 SQLCMD 在执行 SQL 脚本文件时仅输出它遇到的任何错误或警告?
我基本上不希望输出基于信息的消息。
【问题讨论】:
标签: sql sql-server sql-server-2008-r2 sqlcmd
如何让 SQLCMD 在执行 SQL 脚本文件时仅输出它遇到的任何错误或警告?
我基本上不希望输出基于信息的消息。
【问题讨论】:
标签: sql sql-server sql-server-2008-r2 sqlcmd
无法通过传递参数来阻止SQLCMD 返回非错误输出消息。
但是,您可以将错误消息重定向到 STDERR,然后将所有其他消息重定向到 NUL。
这是通过传递-r 参数来完成的。来自books online:
-r[ 0 | 1] 向标准错误发送消息
将错误消息输出重定向到屏幕 (stderr)。如果不指定参数或指定 0,则仅重定向严重级别为 11 或更高的错误消息。如果指定 1,则重定向包括 PRINT 在内的所有错误消息输出。如果使用 -o 则无效。默认情况下,消息被发送到标准输出。
设置-r,具体取决于您要显示的错误消息,但要显示所有错误消息输出,示例命令为:
sqlcmd -Q "select 1 as a; select 1/0 as b" -E -r1 1> NUL
【讨论】:
除此之外,如果您将错误发送到文件中,我发现了这个https://www.simple-talk.com/sql/sql-tools/the-sqlcmd-workbench/
我用过的。如果您省略设置 OUT,那么您只会创建一个错误日志。 所以你有这样的命令:
sqlcmd -x -E -S MyServer -i C:\MySQLBatchToRun.sql
然后在 MySQLBatchToRun.sql 中,像这样
USE MyDatabase
:Error C:\MyErrorLog.txt
:r C:\MySQLScript.sql
GO
在 MySQLScript.sql 中,您可以运行实际的 SQL。这有点令人费解,但有效。我唯一的问题是它似乎创建了一个空的错误日志文件,即使没有错误。
【讨论】:
看起来打印语句是通过 -r1 发送到 stderr 的,因此您可以使用它们与输出分开记录,如下所示:
sqlcmd -Q "print 'hello logfile';select 'Ted' as bro" -r1 1> C:\output.txt 2> C:\logfile.txt
这也适用于 -i 输入文件,例如: sqlcmd -i helloTed.sql -r1 1> C:\output.txt 2> C:\logfile.txt
helloTed.sql:
打印'你好日志文件';
选择'Ted'作为兄弟
也许您可以使用 -Q 并插入 exec 一个包含打印的存储过程。
【讨论】: