Как подавить дефисы в 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 ]

0 голосов
/ 30 января 2015
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
0 голосов
/ 20 июня 2014

MichaelM имеет достойное решение, но, как указал рогатка ... findstr может быть слишком агрессивным и удалять строки данных, содержащие дефисы. Другой подход заключается в вызове sqlcommand для получения набора данных и последующем использовании set / p для получения первой строки из выходного файла и присвоения ее переменной. Затем удалите исходный файл оригинала. Затем выведите заголовки в новый файл. Наконец, направьте еще один 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. Это только захватывает метаданные. Но если имена столбцов взяты из таблиц, которые не существуют до выполнения, вы не можете получить имена этих столбцов.

  • Трой
0 голосов
/ 10 декабря 2013

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

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

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

findstr /B /V /C:"-----" MyTableColumns.csv > MyTableHeader.csv
0 голосов
/ 26 мая 2013

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

(Get-Content "file.txt" | Where {$_.ReadCount -ne 2}) | Set-Content "file.txt"
0 голосов
/ 02 марта 2010

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

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