BULK INSERT einer Unix-Datei unter Windows

27/01/2009 - 13:17 von Detlef | Report spam
Hallo,

bekomme per FTP eine UNIX-Testdatei und muss deren Inhalte per BULK INSERT
in die SQL-Datenbank einfügen.
Egal was ich als ROWTERMINATOR eingebe immer kommt die Fehlermeldung
Meldung 4863, Datenkonvertierungsfehler (Abschneiden) beim Massenladen für
1-Zeile, 1-Spalte (spalte1).

Habe zwar noch làngerem Suchen eine Lösung gefunden:

declare @sql varchar(1000)
select @sql = N'bulk insert #tmpTab FROM ''\\server\Daten.txt'' WITH (
FIELDTERMINATOR = '','', ROWTERMINATOR = '''
select @sql = @sql + CHAR(10)
select @sql = @sql + N''', DATAFILETYPE = ''char'' )'
exec (@sql)
Aber wie klappt es ohne dass ich exec aufrufen muss?

Danke und Gruß
Detlef
 

Lesen sie die antworten

#1 Elmar Boye
28/01/2009 - 15:46 | Warnen spam
Hallo Detlef,

Detlef schrieb:
bekomme per FTP eine UNIX-Testdatei und muss deren Inhalte per BULK INSERT
in die SQL-Datenbank einfügen.



Das einfachste ist normalerweise gleich via FTP aus den
Zeilenvorschüben (LF) ein Wagenrücklauf + Zeilenvorschub (CR+LF)
zu machen, was jeder FTP Client beherrschen sollte.


Egal was ich als ROWTERMINATOR eingebe immer kommt die Fehlermeldung
Meldung 4863, Datenkonvertierungsfehler (Abschneiden) beim Massenladen für
1-Zeile, 1-Spalte (spalte1).



Anders ist es schwieriger:
Denn dummerweise versteht BULK INSERT/BCP unter "" nicht nur ein LF,
was es üblicherweise in Unix und in Programmiersprachen (C/C#) ist,
sondern gleich ein "", was allerdings nur für den Parameter gilt,
nicht für Format-Dateien und als Hinweis versteckt steht in:
<URL:http://msdn.microsoft.com/de-de/lib...5.aspx>

"Wenn Sie bcp interaktiv verwenden und (Zeilenvorschub) als
Zeilenabschlusszeichen angeben, wird dieses Zeichen von bcp automatisch
mit dem Pràfix (Wagenrücklauf) versehen, womit als Ergebnis das
Zeilenabschlusszeichen steht."

und BULK INSERT verhàlt sich (aus Kompatibilitàt) genauso beim
ROWTERMINATOR Parameter.

Und soll damit den Gepflogenheit unter Windows genüge tragen.

Habe zwar noch làngerem Suchen eine Lösung gefunden:

select @sql = @sql + N''', DATAFILETYPE = ''char'' )'
exec (@sql)


die wohl aus Beispiel D) zu BULK INSERT abgeleitet ist:
<URL:http://msdn.microsoft.com/de-de/lib...5.aspx>

Dort wird sich zunutze gemacht, dass "" eben interpretiert wird,
CHAR(10) aber ein Controlzeichen (LF) ist und nicht interpretiert
wird. Nur gibt es in SQL keine Möglichkeit Control-Zeichen anders
anzugeben. (In einem Texteditor ginge es zwar theoretisch, aber
dort wird schnell wieder ein CRLF daraus oder gar noch mehr Zeichen).

Aber wie klappt es ohne dass ich exec aufrufen muss?



Entweder konvertierst Du die Datei bereits beim Empfang via FTP
oder aber Du verwendest eine Formatdatei,
dort wird "" richtig interpretiert, z. B.:

1 SQLCHAR 0 10 "\t" 1 CustomerID Latin1_General_CI_AS
...
11 SQLCHAR 0 48 "" 11 Fax Latin1_General_CI_AS

Gruß Elmar

Ähnliche fragen