Я много раз пытался передать действительный символ TAB в SQLCMD, и я просто не могу заставить его принять его.Мой любимый обходной путь на сегодняшний день - передать SQLCMD ASCII «Разделитель единиц», который является шестнадцатеричным 0x1F, и его можно ввести в командной строке, нажав Ctrl-_ (подчеркивание элемента управления, которое на клавиатуре США становится ctrl-shift-'- '(' - 'рядом с' 0 'в верхнем ряду клавиатуры).
Преимущество использования «Разделителя единиц» состоит в том, что СКОЛЬКО вряд ли будет присутствовать в текстелюбого описания, и был разработан специально для этой цели (см. https://en.wikipedia.org/wiki/Delimiter)
Получив SQLCMD, чтобы сделать это для меня, я затем направляю его вывод через команду перевода Unix-стиля как:
tr '\037' '\t'
\ 037 является восьмеричным для «Разделителя единиц», и \ t представляет символ табуляции, «tr» будет переводить ОБА из них для нас, нам не нужно полагаться на какие-либо приемы цитирования в наших скриптах илиshells.
Чтобы получить 'tr' на окнах, вы можете установить пакет CoreUtils из GnuWin32 (см. http://gnuwin32.sourceforge.net/packages/coreutils.htm) или перейти в более тяжелый режим и установить полную среду Unix, такую как Cygwin (http://cygwin.com/).
).
Помещение двух вПолучим, мы получим:
sqlcmd ... -h-1 -W -k -r1 -s^_ ... | tr '\037' '\t'
и это даст вам ваш вывод с вкладками.
Посмотрите другие опции, которые я использовал выше, они необходимы для получения чистого выводаиз SQLCMD (по порядку;без заголовков, обрезка пробелов, CRLF для пробелов, ошибки в STDERR (не ваш выходной файл!) и «^ _» - это то, как разделитель модулей будет отображаться в командной строке).Вам также нужно добавить «SET NOCOUNT ON;»к вашему запросу или сценарию sql, в противном случае вы получите количество строк в качестве вызывающего сообщения, появившегося в ваших выходных!