Laden...

Import großere Datenmengen + Fehlerbehandlung

Erstellt von 1nf1n1ty vor 8 Jahren Letzter Beitrag vor 8 Jahren 1.755 Views
1nf1n1ty Themenstarter:in
286 Beiträge seit 2007
vor 8 Jahren
Import großere Datenmengen + Fehlerbehandlung

verwendetes Datenbanksystem: SQL Server 2008

Hallo zusammen,

ich möchte in mehreren Datenbanktabellen große Datenmengen importieren. Die Daten stehen in CSV-Dateien, die eingelesen werden. Je nachdem ob ein Datensatz vorhanden ist oder nicht möchte ich ein Insert oder Update machen. In einigen Tabellen möchte ich auch nur ein Insert machen und im Fehlerfall dies ggf. in eine Fehlerdatei schreiben mit der genauen Meldung (z.B. Insert wegen Contraint CNST_XY fehlgeschlagen).

Das Ganze wird ein Importlauf, der jede Nacht einmal laufen muss. Wir reden hier von mehreren Millionen Datensätzen. Benutzt werden soll klassisch der SQLClient, also SqlAdapter oder son Kram. Das habe ich bisher nur für wenige Datensätze verwendet, nicht aber für solch riesige Mengen.

Was ist die beste/schnellste Methode Datensätze einzufügen und trotzdem gescheite Fehlermeldungen zu bekommen ohne das das Programm zu lange läuft?

Bin jeden Vorschlag dankbar.

Viele Grüße

C
2.122 Beiträge seit 2010
vor 8 Jahren

Was wäre zu lange? Wäre es schlimm? Das wären die ersten Fragen die ich mir stellen würde.

Du könntest die Daten zuerst in eine Hilfstabelle eintragen die noch keine Constraints hat. Dann kannst du sie blockweise abarbeiten. Was ein UPDATE braucht auf einmal, was ein INSERT braucht auch auf einmal. Constraints würde ich vorher testen (SELECT ... WHERE Constraint wird verletzt) statt auf Datenbankfehler zu warten, das kostet Zeit und bricht dir deine Massenverarbeitung ab.

127 Beiträge seit 2015
vor 8 Jahren

Suchst du denn nach einer reinen SQL Lösung für dein Problem?
Wenn ja, dann helfen dir vielleicht: Openrowset (Use your text / CSV files in your queries via OPENROWSET)

Oder die DTS (Data Transformation Services) vom SQL Server weiter:
Data Transformation Services

Nachtrag:
Vielleicht auch ein BulkCopy wenn es doch ein wenig C# sein darf:
Using C# And SqlBulkCopy To Import CSV Data Into SQL Server

Hinweis von gfoidl vor 8 Jahren

Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 3.1.

1nf1n1ty Themenstarter:in
286 Beiträge seit 2007
vor 8 Jahren

Hallo zusammen,

danke schonmal für die Antworten. Es soll schon als C# Programm sein, da ich die Daten ggf. noch anpassen muss (in andere Formate bringen, etc.). Es handelt sich auch um mehrere Dateien, die in bestimmer Reihenfolge importiert werden müssen wegen ggf. vorhandener Referenzen.

Da es hier um nächtlich ein paar Millionen Datensätze geht wäre zu lange sowas wie 12 Stunden. Mit 1-2 Stunden kann ich leben. Wichtig ist mir, dass ich zu jedem Datensatz, der nicht imporitert wurde, eine detailierte Fehlermeldung bekomme. Diese Informationen schreibe ich zusammen mit der Zeile in eine neue Datei. Was auch immer das Problem ist, Contraint verletzt, Daten abgeschnitten, etc.: Ich möchte genau wissen was das Problem war.

Das BulkCopy schaue ich mir mal näher an, das scheint vielversprechend zu sein. Weitere Vorschläge nehme ich auch gerne an.

Vielen Dank schonmal und viele Grüße

F
10.010 Beiträge seit 2004
vor 8 Jahren

Was auch immer das Problem ist, Contraint verletzt, Daten abgeschnitten, etc.: Ich möchte genau wissen was das Problem war.

Wenn du das durch die DB machen lässt, geschieht dies über Exceptions.
Diese beenden dann die für Geschwindigkeit benötigte Transaction und sind extrem langsam.

Du solltest also nach Möglichkeit alles vorher Prüfen was geht.

Und zu Insert/Update Solutions for INSERT OR UPDATE on SQL Server

D
985 Beiträge seit 2014
vor 8 Jahren

Da die Struktur (Anzahl und Art der Felder) der Daten ja bekannt sein sollte würde ich für jede Datei eine Klasse erstellen. (siehe LINQ to CSV library )

Diese kann man dann durch alle möglichen Validatoren jagen, konvertieren oder sonst wie umarbeiten und zu guter letzt auf den Server schieben.

Das mit einem DataFlow sollte dann auch ausreichend schnell funktionieren.