2009-12-29 5 views
9

Ich muss einige Daten mithilfe von SQL Server 2000 BCP-Dienstprogramm exportieren. Manchmal enthalten meine Daten Zeichen wie \ t und \ n, die ich als Spalten- und Zeilenabschluss verwenden muss. Wie bekomme ich BCP, um Zeichen zu entkommen, die es als Terminatoren verwendet, während es die Daten ausgibt, damit ich die Daten tatsächlich in ein anderes Programm importieren kann?Get bcp.exe, um Terminatoren zu entkommen

Zum Beispiel ist eine meiner Spalten Textdaten und enthält Tabulatoren und Zeilenumbrüche. BCP exportiert sie nur so, wie sie ist, und das Programm, mit dem ich sie zu importieren versuche, wird verwirrt, weil die Daten in der Mitte einer Zeile enden und/oder eine Zeile ohne ersichtlichen Grund zusätzliche Spalten enthält.

wie ein sehr, Das scheint sehr, sehr Grundfunktion in einem Datenexporteur enthalten, aber keiner von the command-line options scheint es zu erwähnen. (Warum es nicht nur der Standard ist, ist jenseits von mir.) Verpasse ich etwas?

Antwort

-6

Sie können keine Daten mit Tabulatoren und Zeilenumbrüchen mit Tabulatoren und Zeilentrennzeichen haben. Das macht keinen Sinn. Escaping würde nicht helfen, da ein Tab ein Tab ist. Wir sprechen hier nicht von C# -String-Handling.

Was ich tun würde ist verwenden different terminators wie | und ||/n, oder verwenden Sie eine format file

+1

Es macht tatsächlich Sinn - zum Beispiel, mit COPY FROM in PostgreSQL, wird es die Sequenz '\ n' zurück in eine tatsächliche Newline in einer Textspalte machen. Und leider kann ich in PostgreSQL kein Zeilentrennzeichen angeben. – Kev

+0

Auch, obwohl verschiedene Terminatoren eine Problemumgehung ist, dauert es eine * wirklich * lange Zeit, die Post-Abfrage-Ersetzungen durchzuführen. Es wäre viel besser, wenn BCP einfach Textspalten entgehen könnte. – Kev

+0

Weder osql noch sqlcmd unterstützen dies. Was wäre, wenn Sie beispielsweise ein Feld mit dem Escape-Zeichen hätten? Und wenn Sie die PostgreSQL Informationen lesen, erwähnt es über zweifelhafte Flucht ... SQL Server ist absolut vorhersehbar, nein? – gbn

-1

Ich habe das gleiche Problem und suchten eine lange Zeit, um eine Lösung zu finden. Ich fand diese von einem BCP-Master und es klingt vernünftig. Vielleicht möchten Sie es auch versuchen.

Mögliche Lösung: http://groups.google.co.uk/group/microsoft.public.sqlserver.tools/tree/browse_frm/thread/f1ee12cba3079189/ef9094123901fe26?rnum=1&q=lindawie+format+file&_done=%2Fgroup%2Fmicrosoft.public.sqlserver.tools%2Fbrowse_frm%2Fthread%2Ff1ee12cba3079189%2Fef9094123901fe26%3Ftvc%3D1%26q%3Dlindawie%2Bformat%2Bfile%26#doc_fa5708ca51d967a6

Format Datei Details & Design: http://msdn.microsoft.com/en-us/library/aa173859%28SQL.80%29.aspx

Im Allgemeinen kann ich diese Links vorschlagen, um Sie über BCP Probleme und Lösungen zu erhalten wissen: http://groups.google.co.uk/groups?q=lindawie+format+file

Mit freundlichen Grüßen

+0

Links gebrochen und Details der Lösung nicht in der Antwort beschrieben – wrschneider

5

Stimme völlig mit Ihnen überein: Flucht sollte eine Option sein. "Sie können keine Daten mit Tabs oder Zeilenumbrüchen haben" ist das Dümmste, was ich je gehört habe. Hier

ist eine mögliche Lösung:

  1. die Option -r verwenden Sie einen anderen Leitungsabschluss einzustellen. Etwas
    unwahrscheinlich in Ihren Daten vorhanden sein (#! # $ #% #). Ich denke, dass Sie mehrere
    Zeichen verwenden können, so dass es einfacher macht.
  2. Öffnen Sie Ihre Datendatei in sed, einem fähigen Texteditor, oder schreiben Sie ein Skript - und ersetzen Sie alle \ n und \ t Zeichen durch ihre Escapezeichen (\\ n und \\ t). Ersetzen Sie schließlich Ihren Zeilenabschluss mit \ n und Sie sollten gut sein.
  3. Ich denke, die gleiche Sache zu verwenden -t für Feldabschluss gelten sollte

bei this article for more information Werfen Sie einen Blick.

1

Sie können ein Trennzeichen verwenden von mehreren Zeichen aus, wenn man sie zwischen doppelten Anführungszeichen setzen:

bcp MY_TABLE out C:\MY_FILE.txt -S SERVER_IP -d DB_NAME -U MY_USER -P MY_PASSWORD -w -t "&#)^@" -r ">~+!"

die Lösung here gefunden.