10 Stimmen

Warum gibt bcp null aus, wenn die Spalte einen leeren String enthält, und einen leeren String, wenn die Spalte null ist?

Dieses Verhalten kam mir sehr merkwürdig vor, und ich habe eine Weile damit verbracht, meinen Code auf Fehler zu überprüfen, bevor ich Folgendes fand

"out" Kopien aus der Datenbanktabelle oder dem View in eine Datei. Wenn Sie eine vorhandene Datei angeben, wird diese überschrieben. Beim Extrahieren von Daten ist zu beachten, dass das Dienstprogramm bcp eine leere Zeichenkette als Null und eine Nullzeichenkette als leere Zeichenkette darstellt." (aus http://msdn.microsoft.com/en-us/library/ms162802.aspx )

Natürlich konnte ich dadurch mein Problem beheben, aber kennt jemand einen Grund, warum dies der Fall ist?

9voto

gbn Punkte 407102

Es ist zwar schon eine Weile her, aber ich bin sicher, dass es sich um eine Rückwärtskompatibilität/Vergangenheit zu SQL Server 6.5 handelt.

SQL Server 6.5 konnte keine leere Zeichenfolge speichern: Es gab immer ein Leerzeichen. Dies änderte sich mit SQL 7

Also '' -> NULL y ' ' -> '' ist aus der Perspektive der alten Geschichte richtig.

1voto

Diego Palat Punkte 21
SELECT ARTICULO as Articulo, 
        case when rtrim(CCOLOR) = '' then null else rtrim(CCOLOR) end as Color, 
        case when rtrim(TALLE) = '' then null else rtrim(TALLE) end as Talle,
from precios

Senden Sie null anstelle von leer.

Ich finde hier die beste Lösung:

https://bytes.com/topic/sql-server/answers/143738-bcp-inserting-blank-space-empty-string

Ich habe eine Lösung gefunden, indem ich eine Case-Struktur in der sq leere Zeichenfolge in eine Null zu ändern. Das BCP wiederum gibt die resultierende Null als eine leere! Vielen Dank für Ihre Hilfe. Eric

1voto

Bernhard Punkte 2281

Dies bezieht sich auf den Abschnitt "Standardwerte" für das BCP:

https://docs.microsoft.com/en-us/sql/relational-databases/import-export/keep-nulls-or-use-default-values-during-bulk-import-sql-server

Wenn zum Beispiel ein Nullfeld in einer Datendatei vorhanden ist, wird stattdessen der Standardwert für die Spalte geladen.

Man muss an die Zeiten zurückdenken, in denen einfache Textdateien aus anderen seltsamen Systemen importiert wurden. BCP übersetzt '' als "nicht definiert" (=fehlende Daten) und setzt in der Datenbank einen NULL-Wert (=fehlende Daten). Im umgekehrten Fall muss eine NULL aus der Datenbank eine '' für die anderen Systeme.

Um die "echten" Daten aus der Datenbank zu erhalten, verwenden Sie die -k Schalter:

https://docs.microsoft.com/en-us/sql/relational-databases/import-export/keep-nulls-or-use-default-values-during-bulk-import-sql-server#keep_nulls

Die folgenden Bezeichner legen fest, dass ein leeres Feld in der Datendatei seinen Nullwert während des Massenimportvorgangs beibehält, anstatt einen Standardwert (falls vorhanden) für die Tabellenspalten zu erben.

Dann haben Sie Ihr ASCII 0x0 in Ihrer Datei/Datenbank.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X