Autor Beitrag
haschme
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 57
Erhaltene Danke: 1



BeitragVerfasst: Mi 06.04.22 11:36 
Hallo zusammen,

in einem aktuellen Projekt schreibe ich via Bulk Insert die Daten einer CSV-Datei in meine MS-SQL DB.
Bisher hat das immer gut geklappt. (Der Prozess wird mit neuer CSV-Datei (Spaltenamen bleiben gleich) alle paar Monate wiederholt)
Nun habe ich einen Fall in dem zwar alle Spalten für den Import vorhanden sind, jedoch an einer bestimmten Stelle in der CSV-Datei der Spalteninhalt länger ist als die im CreateTable festgelegte Spaltenlänge.

Ich könnte mir vermutlich damit weiterhelfen, die jeweilige Spalte im CreateTable manuell zu verlängern und dann erneut importieren.
Jedoch finde ich die Lösung nicht besonders schön.

Gibt es vielleicht die Möglichkeit sofern ein Inhalt zu lang ist, dass automatisch die Spaltenlänge der Tabelle angepasst wird?

Oder kann man im Bulk Insert übergeben, dass solche Fehler ignoriert werden sollen bzw. wenn es vorkommt, die einzufügende Value ab der erreichten Spaltenlänge abgeschnitten werden soll?


Ich weiß, dass ich auch die MaxErrors hochstellen könnte damit der Import nicht abbricht (zur Zeit erlaube ich 0 Fehler) aber ich möchte, dass der Datensatz trotzdem importiert wird, also nicht in einem Errorfile landet und vom Import ausgeschlossen wird.

Viele Grüße
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 06.04.22 13:30 
Während einem Bulkimport an den Metadaten einer Tabelle zu schrauben klingt ein wenig nach Wahnsinn.
Bulk ist ja in dem Bereich - Große aber dumme Daten in besonders schneller Import einzuordnen. Da an den Metadaten zu schrauben ist vermutlich keine gute Idee wenn man bereits ein volle Tabelle hat. Mal davon abgesehen das Bulk da nix hat.
Bulk ist schnell aber unter anderem eben weil es nix kann ausser simple Daten ohne Logik an den meisten Dingen der DB vorbei direkt in eine Tabelle zu schieben.

Sehe 3 Optionen

a.) Die Spalte gleich als varchar[max] definieren
b.) Auf der Tabelle einen INSTEAD OF Trigger anlegen der die zu langen Daten truncated. Damit der für Bulk zieht muß man das aber explizit einschalten und einen Trigger so schreiben das der bei Bulk das richtige tut aber bei sonstigen Inserts vermutlich die Finger von den Daten lassen soll. Ist vermutlich eher Tricky.
c.) Die csv vorher parsen und eine csv Datei erzeugen mit gekürzten Feldern

Wenn du eh schon varchars benutzt und überlegst die dynamisch zu verlängern beim Bulk Import würde ich zu a.) tendieren.

Für diesen Beitrag haben gedankt: haschme