Как заставить SQLCMD выводить только ошибки и предупреждения?

8

Как вы можете заставить SQLCMD при выполнении файла сценария SQL просто выводить любые ошибки или предупреждения, с которыми он сталкивается?

Я, по сути, не хочу выводить информационные сообщения.

bytedev
источник
Хм, в другом приложении мы могли бы перенаправить вывод ошибок 2> Err.txt, но похоже, что SQLCMDон не разделяет вывод.
Джон на все руки
2
@JonofAllTrades По умолчанию да, SQLCMD отправляет весь вывод на стандартный вывод . Однако вы можете указать SQLCMD отправлять ошибки в stderr с помощью -r0переключателя командной строки, и в этом случае они могут быть перенаправлены в файл с помощью 2>или могут отображаться, пока обычные сообщения перенаправляются через >. Пожалуйста, смотрите мой ответ для деталей.
Соломон Руцкий,

Ответы:

4

По умолчанию SQLCMD отправляет все сообщения, не связанные с ошибками, и сообщения об ошибках на стандартный вывод . Следовательно, попытка перенаправить вывод не поможет.

Первое, что вам нужно сделать, чтобы получить только один или другой тип сообщений (с ошибками или без ошибок), - сказать SQLCMD разделить их, отправив сообщения об ошибках (уровень серьезности 11 или выше) в stderr . Это можно сделать с помощью параметра -rкомандной строки, указав 0в качестве параметра этот параметр (т -r0. Е. ). На данный момент нет видимой разницы с точки зрения запуска SQLCMD и просмотра сообщений любого типа, отображаемых на экране.

Следующая часть - отфильтровать обычные сообщения, идущие на стандартный вывод . Это можно сделать, перенаправив сообщения stdout куда-нибудь через >, но куда? Вы могли бы сделать > file.txt, но я сомневаюсь, что вам нужен файл сообщений, с которого вы не хотели начинать. К счастью, в DOS есть NULключевое слово (это не типо: у него есть одно L, а не два), которое работает как /dev/nullв Unix. Значение вы можете использовать следующий для вывода перенаправления в никуда: > 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

Вывод запроса будет занесен в журнал, и на экране ничего не будет напечатано.

Более подробно в статье MSDN о sqlcmd .

LowlyDBA
источник
Это на самом деле не работает в соответствии с запрошенным «Я, по сути, не хочу выводить информационные сообщения » (мой акцент). Проблема в том, что -r1отправляет все сообщения в stderr , включая PRINTи RAISERROR('', 10, 1)сообщения. Вы должны использовать -r0эти регулярные информационные сообщения для вывода на стандартный вывод , чтобы они перенаправлялись в test.log .
Соломон Руцкий,
1
@srutzky Спасибо, изменил мой ответ, чтобы отразить ваш комментарий.
LowlyDBA
0

Нашел это на SQLServerCentral

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

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

Alf47
источник
Это на самом деле не работает в соответствии с запрошенным «Я, по сути, не хочу выводить информационные сообщения » (мой акцент). Проблема в том, что -r1отправляет все сообщения в stderr , включая PRINTи RAISERROR('', 10, 1)сообщения. Вам нужно использовать, -r0чтобы эти регулярные информационные сообщения отправлялись на стандартный вывод таким образом, чтобы они перенаправлялись в install.log .
Соломон Руцкий,