Как использовать TAB в качестве разделителя столбцов в SQLCMD - PullRequest
10 голосов
/ 30 сентября 2010

SQLCMD поддерживает параметр -s для указания разделителя столбцов, но я не мог понять, как представить символ табуляции (CHAR (9)). Я пробовал следующее, но оба не работают:

sqlcmd -S ServerName -E -Q"select * from mytable" -s"\t" -o results.txt
sqlcmd -S ServerName -E -Q"select * from mytable" -s'\t' -o results.txt

Есть идеи, как это сделать в SQLCMD?

Ответы [ 8 ]

17 голосов
/ 25 мая 2011

В пакетном файле работает размещение вкладки между двойными кавычками.

sqlcmd -S ServerName -E -Q"select * from mytable" -s"   " -o results.txt

для того же самого в файле PowerShell используйте экранированные двойные кавычки, обернутые вокруг экранированной вкладки

sqlcmd -S ServerName -E -Q"select * from mytable" -s `"`t`" -o results.txt
10 голосов
/ 30 сентября 2010

Трудно получить неформатированные результаты из SQLCMD.

Если вы хотите создать выходной файл с разделителями табуляции, лучше подойдет BCP :

bcp "select * from mytable" queryout results.txt -S server -T -c
4 голосов
/ 19 января 2013

Нашел хороший ответ здесь: Файл SQLCMD в виде текстового файла с разделителями табуляции

  1. Открыть Блокнот
  2. Вставьте это: sqlcmd -S (local) -E -s"<TAB>" -Q "select * from sys.dm_exec_query_stats" -o MyOutput.txt -h-1 -W
  3. Выделите , затем нажмите клавишу Tab
  4. Сохранить файл как MyBatch.bat
  5. Запустить MyBatch.bat
3 голосов
/ 12 июня 2012

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

2 голосов
/ 05 ноября 2013

Ответ похож на тот, что был опубликован выше, но я думаю, что он проще.

  1. Откройте текстовый редактор
  2. Нажмите Tab
  3. Выделите кусок пробела (вкладка), созданный
  4. Скопируйте и вставьте это на место в вашей команде SQL

Несмотря на то, что эта вкладка представлена ​​в виде большого пробела, она представляет собой один символ.

В другом ответе были некоторые ненужные вещи о вставке всей команды с "<TAB>". Я думаю, что это сбивает людей с толку (это, безусловно, отбрасывает меня).

1 голос
/ 14 июня 2018

Чтобы работать в окне командной строки, а не в командном файле, я нашел единственный способ решить эту проблему:

sqlcmd -S имя_сервера -E -d имя_базы_данных -Q "выберите col1, char (9) , col2, char (9) , col3, char (9) ) , col4, char (9) , col5 из mytable "-o results.txt -W -w 1024 -s" "-m 1

0 голосов
/ 18 ноября 2018

tldr: используйте ALT+009 код вкладки ascii для символа разделителя

В этом примере замените {ALTCHAR} на ALT+009 (удерживайте клавишу ALT и введите цифры 009)

sqlcmd -E -d tempdb -W -s "{ALTCHAR}" -o junk.txt -Q "select 1 c1,2 c2,3 c3"

Редактировать junk.txt.Вкладки будут находиться между столбцами.

Для других параметров командной строки:

sqlcmd -?

Примечание. Оболочка преобразует символ ALT в ^ I, но если вы попробуете команду, набрав -s "^ I ", вы не получите те же результаты.

0 голосов
/ 18 декабря 2015

Чтобы добиться этого с помощью sqlcmd, вам нужно использовать символ табуляции, например, так: \ t Пример запроса экспорта одной таблицы базы данных sql в текстовый файл с использованием разделителя табуляции выглядит следующим образом:

sqlcmd -S ServerName -d databaseTableName -Q "SELECT * FROM TABLE_NAME" -o C:\backups\tab_delimiter_bakup.txt -s"\t"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...