So verhindern Sie, dass mit SqlBulkCopy doppelte Datensätze eingefügt werden, wenn kein Primärschlüssel vorhanden ist

Ich erhalte eine tägliche XML-Datei mit Tausenden von Datensätzen, die jeweils ein Geschäftsvorgang sind, den ich in einer internen Datenbank für die Berichterstellung und Abrechnung speichern muss. Ich hatte den Eindruck, dass die Datei eines jeden Tages nur eindeutige Datensätze enthielt, habe jedoch festgestellt, dass meine Definition von unique nicht exakt mit der des Anbieters übereinstimmt.

Die aktuelle Anwendung, mit der diese Daten importiert werden, ist eine C # .Net 3.5-Konsolenanwendung. Hierzu wird SqlBulkCopy in eine MS SQL Server 2008-Datenbanktabelle eingefügt, in der die Spalten genau der Struktur der XML-Datensätze entsprechen. Jeder Datensatz hat etwas mehr als 100 Felder, und es gibt keinen natürlichen Schlüssel in den Daten, oder vielmehr die Felder, die ich als zusammengesetzten Schlüssel sinnvoll finden kann, müssen auch Nullen zulassen. Derzeit hat die Tabelle mehrere Indizes, aber keinen Primärschlüssel.

rundsätzlich muss die gesamte Zeile eindeutig sein. Wenn ein Feld unterschiedlich ist, ist es gültig genug, um eingefügt zu werden. Ich habe versucht, einen MD5-Hash der gesamten Zeile zu erstellen, diesen in die Datenbank einzufügen und eine Einschränkung zu verwenden, um zu verhindern, dass SqlBulkCopy die Zeile einfügt, aber ich verstehe nicht, wie der MD5-Hash in den BulkCopy-Vorgang eingefügt wird, und ich bin es nicht Stellen Sie sicher, dass der gesamte Vorgang fehlschlägt und dass ein Rollback ausgeführt wird, wenn ein Datensatz fehlschlägt, oder dass der Vorgang fortgesetzt wird.

Die Datei enthält eine sehr große Anzahl von Datensätzen, die zeilenweise im XML-Format ablaufen, die Datenbank nach einem Datensatz abfragen, der allen Feldern entspricht, und dann das Einfügen entscheiden, ist wirklich die einzige Möglichkeit, die ich sehe, dies zu tun. Ich hatte nur gehofft, die Anwendung nicht komplett neu schreiben zu müssen, und der Massenkopiervorgang ist so viel schneller.

Kennt jemand eine Möglichkeit, SqlBulkCopy zu verwenden, während doppelte Zeilen ohne Primärschlüssel verhindert werden? Oder einen Vorschlag für einen anderen Weg, dies zu tun?

Antworten auf die Frage(7)

Ihre Antwort auf die Frage