Как подавить дефисы в SQLCMD

21

Как я могу подавить дефисы (------------) из набора результатов этой команды 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>
    
задан atricapilla 02.03.2010 в 10:57
источник

13 ответов

13

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

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

    
ответ дан Stef Heyenrath 15.06.2011 в 09:17
источник
  • Пожалуйста, проверьте мой андер ниже. он не содержит -h -1 и отвечает на вопрос. –  Shai Alon 26.06.2016 в 17:37
9

Использование только 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

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

    
ответ дан MichaelM 16.07.2013 в 19:33
источник
7

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

используйте параметр -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

Вам не нужно использовать соединение между вашими утверждениями выбора.

    
ответ дан Justin Hanley 24.07.2015 в 01:01
источник
  • Просто голова, между -h и -1 не может быть пробела. Используйте только: -h-1 –  AAA 10.03.2016 в 22:43
  • @AAA не уверен, что это правда, я использую скрипт с -h -1 в нем без проблем, его понимание, что они похожи на любой другой переключатель командной строки, например -d или -U, нужно пространство –  Justin Hanley 11.03.2016 в 23:01
  • , тогда как это удаляет черточки «---», также удаляет имена столбцов для меня –  davidski 26.09.2017 в 11:18
  • примечание @davidski в приведенном выше скрипте вам нужно иметь дополнительный выбор, чтобы на самом деле создавать имена столбцов, выберите 'your_column_1, your_column_2' выберите * из your_table –  Justin Hanley 26.09.2017 в 18:44
  • жалко - контролировал это полностью. есть ли способ сохранить имена, но просто избегайте досадных тире? –  davidski 06.10.2017 в 11:28
3

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

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

, чтобы удалить вторую строку?

Вы можете получить команду Win32 из Ссылка

    
ответ дан dsz 12.06.2012 в 07:42
источник
2

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

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

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

Создайте пустой 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

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

  • -h-1 удаляет заголовок, сгенерированный SQLCMD
  • -W удаляет конечные пробелы
  • -w установить максимальную ширину строки
  • -s определяет разделитель столбцов
ответ дан DanielM 30.01.2012 в 15:52
источник
2

Вот и все!

  

Как я могу подавить дефисы (------------) из набора результатов этой команды 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
    
ответ дан Shai Alon 20.06.2016 в 16:43
источник
  • Но где заголовки? Вопрос заключался только в подавлении дефисов. –  JustinStolle 20.06.2016 в 21:06
  • Слишком плохо, что сервер sql не имеет команды rellative, как в Oracle: «set und off» ... –  Shai Alon 21.06.2016 в 23:01
  • @JustinStolle Хорошо, я получил его, со смесью других ответов ... Ответ исправлен. Извините, я не понял вопроса. –  Shai Alon 21.06.2016 в 23:45
  • @JustinStolle? Вы согласны? –  Shai Alon 26.06.2016 в 17:35
  • Да, теперь это касается заданного вопроса. Я удалил свой downvote. –  JustinStolle 28.06.2016 в 01:17
0

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

SET UNDERLINE OFF,

    
ответ дан rob h 14.10.2016 в 16:27
источник
  • Полностью ложно; это даже не допустимая команда в SQL, а тем более любой другой язык в области этого вопроса. –  NateJ 15.11.2016 в 22:55
0

Если вы можете сначала выполнить вывод в файл (используя параметр -o ) , другой параметр после обработки с использованием > powershell будет работать, читая содержимое файла - пропуская вторую строку - и записывая его обратно в себя.

(Get-Content "file.txt" | Where {$_.ReadCount -ne 2}) | Set-Content "file.txt"
    
ответ дан JustinStolle 26.05.2013 в 09:13
источник
  • Почему вам нужно использовать другой внешний инструмент в качестве PS, когда у вас есть опция -h -1 в sqlcmd? –  Shai Alon 20.06.2016 в 16:47
  • @ShaiAlon Параметр -h -1 полностью удаляет заголовок. Вопрос заключался в том, как удалить только дефисы, которые появляются после строки заголовков. –  JustinStolle 20.06.2016 в 21:04
  • Повторите мой ответ, я исправил его. –  Shai Alon 26.06.2016 в 17:35
0

MichaelM имеет достойное решение, но, как показала рогатка, findstr может быть более агрессивным и удалять строки данных, содержащие дефисы. Другой подход заключался бы в вызове sqlcommand для получения набора данных, а затем с использованием set / p для захвата первой строки из выходного файла и назначения ее переменной. Затем удалите выходной файл orignal. Затем выделите заголовки для нового файла. И, наконец, подключите другой файл sqlcmd без заголовка к этому файлу.

sqlcmd -S server -d database -E -Q "exec myStoredProcedure" -W -o my_headers.csv -m-1
set /p headers=< my_headers.csv
del my_headers.csv
echo %headers% > my_data.csv
sqlcmd -S server -d database -E -Q "exec myStoredProcedure" -W -m-1 -h-1 >> my_data.csv

Также Top 0 - хороший выбор для создания «файла заголовков», но только если вы используете оператор select. Если вы вызываете хранимую процедуру, изучите использование FMTONLY ON, чтобы захватить заголовки только из SP.

sqlcmd -S server -d database -E -Q "Set NOCOUNT ON; Set FMTONLY ON; exec myStoredProcedure" -W -o my_headers.csv -m-1

Следует отметить, что FMTONLY ON не может использоваться против SP с использованием #temp-таблиц. Это связано с тем, что FMTONLY ON не выполняет SP. Он захватывает только метаданные. Но если имена столбцов поступают из таблиц, которые не существуют перед выполнением, то вы не можете получить имена этих столбцов.

  • Трой
ответ дан Troy Witthoeft 20.06.2014 в 16:46
источник
0
Public Sub HyphenDelete(strFilename1 As String, Hyphens As Integer)


Const FOR_READING = 1
Const FOR_WRITING = 2

strFileName = strFilename1

strCheckForString = Left("-------", Hyphens)
Set objFS = CreateObject("Scripting.FileSystemObject")
Set objTS = objFS.OpenTextFile(strFileName, FOR_READING)
strContents = objTS.ReadAll
objTS.Close

arrLines = Split(strContents, vbNewLine)
Set objTS = objFS.OpenTextFile(strFileName, FOR_WRITING)

For Each strLine In arrLines
   If Not (Left(UCase(LTrim(strLine)), Len(strCheckForString)) = strCheckForString) Then
      objTS.WriteLine strLine
   End If
Next

End Sub
    
ответ дан guest 30.01.2015 в 16:49
источник
0

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

Для меня самым простым способом было использовать sed . Хотя это уже было предложено здесь, был некорректный синтаксис для одновременного запуска sqlcmd и sed. Если вы используете Windows, как это было для меня, отправляйтесь в Ссылка , чтобы загрузить 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 , как было сказано выше, и присутствует в их документации, или вы получите сообщение об ошибке.

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

    
ответ дан Kade Beem 20.02.2018 в 23:13
источник
-1

Следующая строка:

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

очень опасен, поскольку он удаляет все строки, содержащие «-». Вы лучше посмотрите на findstr /? и используйте что-то вроде:

findstr /B /V /C:"-----" MyTableColumns.csv > MyTableHeader.csv
    
ответ дан slingshot 10.12.2013 в 18:53
источник
-1

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

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

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

    
ответ дан Dan 10.06.2015 в 02:57
источник
  • Вы можете сделать это сразу после запроса без перенаправления на файл –  Shai Alon 21.06.2016 в 23:30