Разделение sqlcmd stdout и stderr

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

 -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» в именованный канал, а затем удалять сообщения об ошибках из результатов именованного канала?

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


person Steve    schedule 17.02.2017    source источник


Ответы (1)


У вас работает "sqlcmd -i debug_dir/test2.sql -r1 2> /tmp/2.out 1> /tmp/1.out"?

Я попробовал это на своем локальном ящике:

$> cat debug_dir/test2.sql

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

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

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

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

$> кошка /tmp/1.out i j k


      2           1           3
      1           2           3
      2           1           4

(затронуты 3 ряда) a b c


      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. Сообщение 104309, уровень 16, состояние 1, сервер XXX, строка 1. Во входном скрипте нет пакетов.

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

Надеюсь, это поможет.

person Tuan    schedule 17.02.2017