Как подавить дефисы в SQLCMD - PullRequest
26 голосов
/ 02 марта 2010

Как я могу подавить дефисы (------------) из набора результатов этой команды sqlcmd:

C:\temp>sqlcmd -d AdventureWorks -s ";" 
 -Q "SET NOCOUNT ON SELECT top 5 FirstName, LastName FROM Person.Contact;"
FirstName                                         ;LastName
--------------------------------------------------;----------------------------
Gustavo                                           ;Achong
Catherine                                         ;Abel
Kim                                               ;Abercrombie
Humberto                                          ;Acevedo
Pilar                                             ;Ackerman

C:\temp>

Ответы [ 15 ]

14 голосов
/ 15 июня 2011

Единственное, о чем я могу думать, - это удалить заголовок с помощью переключателя -h -1 и добавить имена столбцов в качестве первой строки в SQL-запрос:

SELECT 'FirstName' as FirstName, 'LastName' as LastName
UNION
SELECT top 5 FirstName, LastName FROM Person.Contact

Обратите внимание, что если есть другие типы данных, то (var)char, вам необходимо преобразовать поле с помощью: CAST(MyColumnName AS varchar(32)) as MyColumnName

11 голосов
/ 24 июля 2015

Я не видел всю эту информацию в одном месте и подумал, что следующий человек, который ее ищет, может это оценить ...

используйте параметр -h -1, чтобы удалить тире (--------) из выходных данных, и SET NOCOUNT ON, чтобы удалить "затронутые строки". Это хорошо, если вы создаете отчет или файл CSV для обработки другой системой.

Пример:

SQLCMD -S 127.0.0.1\SQL_SERVER_Instance -d db_name -U db_login -P password -i your_script.sql -o your_output.csv -h -1

В вашем скрипте SQL:

SET NOCOUNT ON -- removes (rows affected from the output)
select 'your_column_1, your_column_2'
select * from your_table

Для этого вам не нужно использовать объединение между операторами выбора.

9 голосов
/ 16 июля 2013

Использование только sqlcmd и командной строки Windows без хранимых процедур:

REM Get the column headers ("set nocount on" is necessary to suppress the rows affected message)
sqlcmd -S MyServer -Q "set nocount on;select top 0 * from MyDatabase.MySchema.MyTable" -o "MyTableColumns.csv" -s "," -W

REM Remove hyphen line
findstr /R /C:"^[^-]*$" MyTableColumns.csv > MyTableHeader.csv

REM Get data without headers
sqlcmd -S MyServer -Q "set nocount on;select * from MyDatabase.MySchema.MyTable" -o "MyTableData.csv" -h -1 -s "," -W
REM You can also use bcp for this step
REM bcp "select * from MyDatabase.MySchema.MyTable" queryout  "MyTableData.csv"  -c -t"," -r"\n" -S MyServer -T

REM Append header and data
type MyTableHeader.csv MyTableData.csv > MyTableDataWithHeader.csv

Для обработки данных с разделителями внутри (например, «Atlanta, GA») вам нужно указать поля отдельно (вместо использования «select *») и использовать функцию QUOTENAME в SQL Server.

4 голосов
/ 20 июня 2016

Вот и все!

Как можно выделить дефисы (------------) из набора результатов этой команды sqlcmd:

Вы можете сделать все это простым способом с помощью команды 1 , без каких-либо скриптов или манипуляций с файлами !!

sqlcmd -d AdventureWorks -s ";" -Q "SET NOCOUNT ON; SELECT top 5 FirstName, LastName FROM Person.Contact" |findstr /v /c:"---"

Добавьте set nocount on;, чтобы удалить строку (X rows affected). Добавьте |findstr /v /c:"---" для удаления подчеркивания. Таким образом, вы получите чистый ответ только с:

FirstName                                         ;LastName
Gustavo                                           ;Achong
Catherine                                         ;Abel
Kim                                               ;Abercrombie
Humberto                                          ;Acevedo
Pilar                                             ;Ackerman
3 голосов
/ 12 июня 2012

Или, возможно, постобработка вывода через sed как:

sqlcmd ... | sed -e '2d'

удалить вторую строку?

Вы можете получить Win32 sed от http://gnuwin32.sourceforge.net/packages/sed.htm

2 голосов
/ 30 января 2012

Чтобы избавиться от дефисов, я добавляю в мои хранимые процедуры некоторый код, который будет выводить только заголовок столбца. Извлечение данных с помощью SQLCMD выполняется в 2 части.

Сначала я вызываю хранимую процедуру со специальным набором параметров. В моем случае, когда я вызываю SP со всеми NULL, это означает, что я хочу иметь заголовок столбца.

Затем я вызываю SQLCMD второй раз и добавляю вывод в файл, который я только что создал, и вуаля!

Создать пустой CSV-файл для хранения заголовка столбца

sqlcmd -S server -d database -U username -P password -o "somefile.csv" -h-1 
  -Q "exec myStoredProcedure NULL, NULL" -W -w 2000 -s"," > sometextfile.csv

Теперь добавьте результат вывода из хранимой процедуры

sqlcmd -S server -d database -U username -P password -o "somefile.csv" -h-1 
  -Q "exec myStoredProcedure 2011, 10" -W -w 2000 -s"," >> sometextfile.csv

Обратите внимание первая команда использует > , а вторая >> . При использовании одного -> «Создать или перезаписать» и двух -> «Добавить или создать».

  • -h-1 удаляет заголовок, сгенерированный SQLCMD
  • -W удаляет завершающие пробелы
  • -w установить максимальную ширину строки
  • -s определяет разделитель столбцов
1 голос
/ 21 февраля 2018

Мне пришлось провести тонну исследований, потому что ни один из ответов здесь не соответствовал тому, что я искал. Поэтому я собираюсь подвести итог в надежде, что это поможет другим.

Для меня проще всего было использовать sed. Хотя это уже было предложено здесь, был неправильный синтаксис для одновременного запуска sqlcmd и sed. Если вы используете Windows, как это было для меня, зайдите на http://gnuwin32.sourceforge.net/packages/sed.htm, чтобы скачать sed

Моя последняя команда выглядела примерно так:

SQLCMD -m 1 -S "userpc\SQLEXPRESS" -E -i "C:\someDirectory\sqlfile.sql" -W -s "," -o "C:\someDirectory\output.csv" && sed -i 2d "C:\someDirectory\output.csv"

Где

- -m 1 исключает строку "Изменен контекст базы данных на ..."
- && запускает вторую команду, если первая команда выполняется успешно
- sed -i 2d удаляет вторую строку, содержащую дефисы, и перезаписывает вывод sed в исходный вывод

Помните, что имя выходного файла sed и выходные данные из sqlcmd должны совпадать, иначе выходные данные из sqlcmd не будут корректно перезаписаны. Не должно быть кавычек вокруг 2d в операторе sed, как указано выше, и оно присутствует в их документации, иначе вы получите ошибку.

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

0 голосов
/ 08 января 2019

удалить тире из результатов:

EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'testMail',
@recipients = 'krishan@gmail.com',
@query = '  
SET NOCOUNT ON
SELECT W.* FROM (
(SELECT CAST("id" AS VARCHAR(5) ) as id , CAST("name" AS VARCHAR(50) )as name ) 
UNION ALL 

SELECT CAST( id AS VARCHAR(5) ) AS id, CAST (name AS VARCHAR(50) ) AS name from mydb.dbo.bank
 )W
' ,
@subject = 'Test email',
@attach_query_result_as_file = 1,
@query_attachment_filename='filename.xls',
@query_result_separator='   ',   
@query_result_header = 0

    -----remember @query..separator should be--Tab space----
0 голосов
/ 14 октября 2016

если вы хотите вывести данные из строя, вы можете установить следующий переключатель:

SET UNDERLINE OFF;

0 голосов
/ 10 июня 2015

При выводе в файл попробуйте следующее при успешном выполнении:

    findstr /v /c:"---" sqloutput.dat > finaloutput.dat

Я использую «---», так как все мои столбцы содержат более 3 символов, и у меня никогда не будет этой строки в моих данных, но вы также можете использовать «-; -» для дальнейшего снижения риска или любого разделителя на основе ваших данных в место ";".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...