Как использовать TAB в качестве разделителя столбцов в SQLCMD

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?

13 ответов

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

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

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

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

bcp "select * from mytable" queryout results.txt -S server -T -c

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

  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

Я много раз пытался передать действительный символ TAB в SQLCMD, и я просто не могу заставить его принять его. Мой любимый обходной путь на сегодняшний день - передать SQLCMD ASCII "Разделитель единиц", который является шестнадцатеричным 0x1F, и его можно ввести в командной строке, нажав Ctrl-_ (подчеркивание элемента управления, которое на клавиатуре США становится ctrl-shift-'-' (' - 'рядом с'0'в верхнем ряду клавиатуры).

Преимущество использования "Разделителя единиц" состоит в том, что СКОЛЬКО вряд ли будет присутствовать в тексте любого описания, и было разработано специально для этой цели (см. https://en.wikipedia.org/wiki/Delimiter)

Получив для меня SQLCMD, я передаю его вывод через команду перевода в стиле Unix:

tr '\037' '\t'

\037 является восьмеричным для "Разделителя единиц", и \t представляет символ табуляции, "tr" будет переводить ОБА из них для нас, нам не нужно полагаться на какие-либо приемы цитирования в наших скриптах или оболочках.

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

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

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

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

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

Это единственный способ, который я нашел, чтобы решить это:

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

sqlcmd -S Имя_сервера -E -Q"выберите * из моей таблицы" -s $'\t' -W -o results.txt

Попробуйте использовать горизонтальные полосы прокрутки с помощью cmd.exe или PowerShell. Щелкните правой кнопкой мыши ярлык и щелкните свойства для повторного использования или щелкните правой кнопкой мыши строку заголовка и щелкните свойства после открытия, затем щелкните вкладку макета. В размере экранного буфера установите ширину и высоту 8000, а затем снимите флажок переносить вывод текста при изменении размера (важно). Щелкните ОК. Затем восстановите, нажав кнопку рядом, чтобы свернуть. Вы должны увидеть горизонтальные и вертикальные полосы прокрутки. Теперь вы можете развернуть окно и прокручивать его в любом направлении. Теперь вы можете видеть все записи в базе данных.

У меня возникла эта проблема при попытке запустить sqlcmd на терминале. Я заставил его работать, введя символ табуляции (копирование из текстового редактора у меня не сработало).

Нажмите cntrl + v, затем вкладку.

Как ввести символ табуляции в командной строке?

Используйте динамический sql с CHAR(9):

SET @cmd ='SQLCMD -S MyServer -d MyDatabase -E -W -Q "SELECT * FROM MyTable" -s"' + CHAR(9) + '" -o "MyFilePath.txt"'

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", вы не получите тот же результат.

Если в Linux, это будет работать как -s (col_separator)

-s "$(printf" t "| tr 't' '\t')" или

SQLCMDCOLSEP="$(printf" t "| tr 't' '\t')" sqlcmd -S ...

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

sqlcmd -S ServerName -d databaseTableName -Q "SELECT * FROM TABLE_NAME" -o C:\backups\tab_delimiter_bakup.txt -s"\t"
Другие вопросы по тегам