it-swarm.com.de

Also unterdrücken Sie Bindestriche in SQLCMD

Wie kann ich Bindestriche (------------) aus der Ergebnismenge dieses sqlcmd-Befehls unterdrücken:

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>
25
atricapilla

Das einzige, was mir einfällt, ist das Entfernen des Headers mit dem -h -1-Schalter und das Hinzufügen der Spaltennamen als erste Zeile zur SQL-Abfrage:

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

Wenn es andere Datentypen als (var)char gibt, müssen Sie das Feld folgendermaßen konvertieren: CAST(MyColumnName AS varchar(32)) as MyColumnName

14
Stef Heyenrath

Ich habe all diese Informationen nicht an einem Ort gesehen und dachte, die nächste Person, die danach sucht, könnte es zu schätzen wissen ... 

verwenden Sie die Option -h -1, um die Bindestriche (--------) aus der Ausgabe zu entfernen, und SET NOCOUNT ON, um die betroffenen Zeilen zu entfernen. Dies ist ideal, wenn Sie einen Bericht oder eine CSV-Datei erstellen, die von einem anderen System verarbeitet werden soll.

Beispiel:

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

In Ihrem SQL-Skript:

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

Sie müssen dazu keine Union zwischen Ihren select-Anweisungen verwenden.

10
Justin Hanley

Verwenden Sie nur sqlcmd und die Windows-Befehlszeile ohne gespeicherte Prozeduren:

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

Um Daten mit Trennzeichen (z. B. "Atlanta, GA") zu behandeln, müssen Sie die Felder separat angeben (anstatt "select *" zu verwenden) und die Funktion QUOTENAME in SQL Server verwenden.

9
MichaelM

Das ist es!

Wie kann ich Bindestriche (------------) aus der Ergebnismenge dieses Befehls sqlcmd unterdrücken:

Sie können das alles auf einfache Weise mit dem Befehl 1 , ohne Skript- oder Dateimanipulationen tun.

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

Fügen Sie set nocount on; hinzu, um die (X rows affected)-Zeile zu entfernen. Fügen Sie|findstr /v /c:"---"hinzu, um die Unterstreichungen zu entfernen. Auf diese Weise erhalten Sie eine saubere Antwort, nur mit:

FirstName                                         ;LastName
Gustavo                                           ;Achong
Catherine                                         ;Abel
Kim                                               ;Abercrombie
Humberto                                          ;Acevedo
Pilar                                             ;Ackerman
3
Shai Alon

Oder Sie können die Ausgabe über sed nachbearbeiten:

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

die zweite Zeile löschen?

Sie können ein Win32-Sed von http://gnuwin32.sourceforge.net/packages/sed.htm erhalten. _

3
dsz

Um die Bindestriche loszuwerden, füge ich meinen gespeicherten Prozeduren etwas Code hinzu, der nur den Spaltenkopf ausgibt. Das Extrahieren von Daten mit SQLCMD erfolgt in zwei Teilen. 

Zuerst rufe ich meine gespeicherte Prozedur mit einem speziellen Parametersatz auf. In meinem Fall, wenn ich SP mit allen NULLs anrufe, bedeutet dies, dass ich die Spaltenüberschrift haben möchte. 

Dann rufe ich SQLCMD ein zweites Mal an und hänge die Ausgabe an die Datei an, die ich gerade erstellt habe, und voila!

Erstellen Sie eine leere CSV-Datei, die die Spaltenüberschrift enthalten soll

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

Hängen Sie nun das Ausgabeergebnis aus der gespeicherten Prozedur an

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

Hinweis Der erste Befehl verwendet> und den zweiten Befehl >> . Bei Verwendung von -> "Erstellen oder Überschreiben" und zwei -> "Anhängen oder Erstellen".

  • -h-1 entfernt den von SQLCMD generierten Header
  • -W entfernt die nachfolgenden Leerzeichen
  • -w Legt die maximale Zeilenbreite fest
  • -s definiert das Spaltentrennzeichen
2
DanielM

wenn Sie die Daten herausspulen möchten, können Sie den folgenden Schalter einstellen: 

UNDERLINE OFF einstellen;

1
rob h

Ich musste eine Menge recherchieren, weil keine der Antworten hier genau dem entsprach, was ich gesucht hatte. Ich werde also hoffen, dass es anderen helfen wird.

Für mich war der einfachste Weg, sed zu verwenden. Während dies hier bereits vorgeschlagen wurde, gab es eine falsche Syntax, um sqlcmd und sed gleichzeitig auszuführen. Wenn Sie Windows verwenden, wie es für mich der Fall war, besuchen Sie http://gnuwin32.sourceforge.net/packages/sed.htm , um sed herunterzuladen

Mein letzter Befehl sah ungefähr so ​​aus:

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"

Woher

--m 1 beseitigt die Zeile "Geänderter Datenbankkontext in ..."
-&& führt den zweiten Befehl aus, wenn der erste Befehl erfolgreich ausgeführt wurde
-sed -i 2d löscht die zweite Zeile mit den Bindestrichen und überschreibt die Ausgabe von sed mit der ursprünglichen Ausgabe

Beachten Sie, dass der Name der Ausgabedatei sed und die Ausgabe von sqlcmd übereinstimmen müssen, da sonst die Ausgabe von sqlcmd nicht ordnungsgemäß überschrieben wird. In der sed-Anweisung sollte es keine Anführungszeichen um 2d geben (siehe oben), die in der Dokumentation enthalten sind. Andernfalls erhalten Sie eine Fehlermeldung.

Hoffe das hilft!

1
Kade Beem

MichaelM hat eine anständige Lösung, aber wie Slingshot darauf hinweist, könnte findstr über aggressiv sein und Datenzeilen entfernen, die Bindestriche enthalten. Ein anderer Ansatz wäre, den Befehl sqlcommand aufzurufen, um den Datensatz abzurufen, und dann set/p verwenden, um die erste Zeile aus der Ausgabedatei zu ziehen und einer Variablen zuzuweisen. Dann löschen Sie die ursprüngliche Ausgabedatei. Anschließend die Header in eine neue Datei auschecken. Leiten Sie schließlich ein weiteres headerloses sqlcmd in diese Datei. 

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

Auch Top 0 ist eine gute Wahl, um eine "Nur-Header-Datei" zu erstellen, jedoch nur, wenn Sie eine Select-Anweisung verwenden. Wenn Sie eine gespeicherte Prozedur aufrufen, verwenden Sie FMTONLY ON, um nur die Header des SP zu übernehmen. 

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

Eine Einschränkung ist, dass der FMTONLY ON nicht gegen SPs verwendet werden kann, die #temp-Tabellen verwenden. Dies liegt daran, dass FMTONLY ON den SP nicht ausführt. Es werden nur Metadaten erfasst. Wenn die Spaltennamen jedoch aus Tabellen stammen, die vor der Ausführung nicht vorhanden sind, können Sie diese Spaltennamen nicht erhalten.

  • Troy
0
Troy Witthoeft

Wenn Sie zuerst (mit der -o-Option)} in eine Datei ausgeben könnten, würde eine andere Nachverarbeitungsoption mit powershell funktionieren, indem Sie den Inhalt der Datei lesen, die zweite Zeile überspringen und schreiben es zurück zu sich selbst.

(Get-Content "file.txt" | Where {$_.ReadCount -ne 2}) | Set-Content "file.txt"
0
JustinStolle

Sie können Folgendes tun:

exec 'sqlcmd -S YourServer -E -Q "set nocount on; select * from YourTable" -s "," -W | findstr /R /C:"^[^-]*$" > yourfile.csv'

Dadurch wird auf einen Schlag eine CSV-Datei mit den Kopfzeilen, ohne die Bindestriche und mit dem zugeschnittenen Leerraum erstellt. Basierend auf der obigen Antwort von MichaelM.

0
Paschover
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
guest

bindestriche aus den Ergebnissen entfernen:

EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'testMail',
@recipients = '[email protected]',
@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----