Как использовать 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 как текстовый файл с разделителями табуляции
- Открыть Блокнот
- Вставьте это:
sqlcmd -S (local) -E -s"<TAB>" -Q "select * from sys.dm_exec_query_stats" -o MyOutput.txt -h-1 -W
- Выделите
, затем нажмите клавишу Tab - Сохраните файл как MyBatch.bat
- Запустите 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, в противном случае вы получите количество строк в качестве вызывающего сообщения, появившегося в вашем выводе!
Подобный ответ опубликован выше, но я думаю, что он проще.
- Откройте ваш текстовый редактор
- Нажмите Tab
- Выделите кусок пробела (вкладка), созданный
- Скопируйте и вставьте это в место в вашей команде 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"