2017-02-17 16 views
0

Мне нужно внедрить тестовый жгут для хранилища данных Azure SQL с использованием sqlcmd в Linux. В своем тесте я хочу зафиксировать любые сообщения об ошибках, обнаруженные sqlcmd, но отправить результаты запроса в/dev/null (используя аргумент -o). При рассмотрении https://msdn.microsoft.com/en-us/library/ms162773.aspx, кажется, что если -o используется, -r1 не имеет смысла.Разделение stdout sqlcmd и stderr

-r[0 | 1] 
    Redirects the error message output to the screen (stderr). If you do not specify a parameter or if you specify 0, only error messages that have a severity level of 11 or higher are redirected. If you specify 1, all error message output including PRINT is redirected. Has no effect if you use -o. By default, messages are sent to stdout. 

Проблемы с пониманием того, почему stdout и stderr будут перемешаны таким образом.

Мое единственное средство запуска sqlcmd в фоновом режиме при записи «stdout + stderr» в именованный канал, а затем отключить сообщения об ошибках из результатов именованного канала?

Я не хочу задерживаться при записи вывода, но хочу вернуть все результаты клиенту.

ответ

1

Делает ли «sqlcmd -i debug_dir/test2.sql -r1 2> /tmp/2.out 1> /tmp/1.out« работа для вас?

Я попробовал его на моем локальном поле:

$> кошка debug_dir/test2.sql

выберите * от test1; go

выбрать * из test1 где i = 'a'; go

выбрать * из тест2; идти

$> SQLCMD -S XXX -N -U YYY ZZZ -P -d AAA -I -i debug_dir/test2.sql -r1 2> /tmp/2.out 1> /tmp/1.out

$> кошка /tmp/1.out IJK


 2   1   3 
     1   2   3 
     2   1   4 

(3 ряда пострадавших) аЬс


 2   1   4 
    11   12   4 
    11   12   3 
     2   1   3 

$> cat /tmp/2.out Msg 245, уровень 16, состояние 1, сервер XXX, строка 1 Ошибка преобразования при преобразовании значения varchar 'a' в тип данных int. Msg 104309, уровень 16, состояние 1, сервер XXX, строка 1 Во входном скрипте нет партий.

Вы можете перенаправить в/DEV/нуль вместо /tmp/1.out

Я надеюсь, что помогает.