none
BCP NUL Terminator RRS feed

  • Frage

  • Guten Tag,

    ich arbeite mit dem BCP Befehl, um Daten in eine Textdatei zu exportieren (SQL Server 2014).

    Der Befehl sieht so aus:

    bcp "EXEC ..." queryout "J:\Datei.sql" -c -C 1252  -r \n   -S 127.0.0.1\SQLEXPRESS -U User -P Passwort

    In der erzeugten Datei stehen seit einiger Zeit NUL (\0) Werte, die Probleme bereiten.

    Ich habe bisher nicht herausgefunden, woher diese NUL Werte kommen.

    Wenn ich das SQL im Managment Studio erzeuge und das Ergebnis in eine Textdatei schreibe, habe ich diese NUl Werte nicht.

    Hat jemand eine Idee?

    Danke für Eure Hilfe und

    Gruß aus Berlin

    Gregor

    Montag, 31. August 2020 07:34

Alle Antworten

  • Leere Zeichenketten werden mit Hex 00 (NUL) ausgegeben, SQL NULL ergibt dann eine leere Zeichenkette.
    Hier hilft dann ein

    NULLIF(Feld, '')

    um NUL zu entfernen.

    Montag, 31. August 2020 07:49
  • Hallo,

    vielleicht fehlte die Info. Es geht nicht um Feldinhalte, sondern um Zeilentrenner.

    Schaut man sich das in Notepad++ an, sieht man NULCRLF

    Gruß

    Gregor


    Montag, 31. August 2020 08:03
  • Das habe ich schon verstanden:
    https://www.sqlnethub.com/blog/handling-null-character-x00-when-exporting-to-file-using-bcp/

    Somit kannst du das nur mit NULLIF beheben.

    Montag, 31. August 2020 08:08
  • Hallo, den Artikel habe ich gelesen, da geht es doch aber auch um Feldinhalte?

    Vielleicht habe ich es schlecht erklärt. Das SQL Statement, welches ich per BCP ausführe, erzeugt ein SQlL Skript, was ich auf einem anderen System ausführen möchte.

    Das erzeugte Skript , welches in der Ausgabedatei landet, sieht dann so aus:

    SELECT * FROM dbo.Foo

    NILCRLF

    EXEC dbo.Foo

    Wenn man dieses SQL Statement per SSMS oder HeidiSQL ausführen möchte, geht das wegen es NUL nicht.

    Gruß

    Gregor

    Dienstag, 1. September 2020 09:29
  • Das ist dein Problem.
    Per "Select *" erhältst du alle Felder "as is".
    Das Ergebnis gibst du an BCP weiter.
    Nun gibt es leider eine Unterscheidung zwischen einem Feldinhalt NULL und dem Feldinhalt leere Zeichenkette.
    Da dies nun mal unterschiedlich ist behandelt BCP dies, wie beschrieben.

    Wenn das NUL-Zeichen nun zufällig am Ende einer Zeile auftritt, gehe ich davon aus, dass das letzte Feld der Abfrage eine leere Zeichenkette enthält, die BCP zu NUL konvertiert.

    Allerdings:
    Was soll die Angabe "NILCRLF"?
    Ich denke, hier sollte CRLF reichen, da NIL auch als NUL betrachtet wird.

    Wie man Zeilentrennzeichen definiert, siehe hier:
    https://docs.microsoft.com/de-de/sql/relational-databases/import-export/specify-field-and-row-terminators-sql-server?view=sql-server-ver15

    Dienstag, 1. September 2020 10:07
  • sorry, ich freue mich über jede Hilfe, aber ich habe das Gefühl, dass wir aneinander vorbei reden.

    Ich hatte weiter oben geschrieben, dass das SQL Statement kein NUL liefert.

    >>Was soll die Angabe "NILCRLF"?
    >>Ich denke, hier sollte CRLF reichen, da NIL auch als NUL betrachtet wird.

    Das ist doch das Problen, das muss irgendwie durch das BCP kommen, durch das Select kommt das nicht.

    Den Zeilentrenner habe ich sicherheitshalber mit \r n angegeben (obwohl das ja der Default ist), wie auch oben beschrieben

    Mittwoch, 2. September 2020 07:17
  • Dann prüfe einfach was dein Exec-Aufruf macht und daher erzeugt.
    bcp "EXEC ..."

    Alternativ probiere doch einfach

    bcp "SELECT * FROM dbo.Foo" ....

    Mittwoch, 2. September 2020 07:40