Wie wird BULK INSERT verwendet, wenn Zeilen von Fremdschlüsselwerten abhängen?

8

Meine Frage bezieht sich auf diese Frage, die ich gestellt habe auf ServerFault .

Basierend darauf habe ich die Verwendung von BULK INSERT in Betracht gezogen. Ich verstehe jetzt, dass ich eine Datei für jede Entitäten vorbereiten muss, die ich in der Datenbank speichern möchte. Egal was, ich frage mich immer noch, ob dieses BULK INSERT das Speicherproblem auf meinem System vermeiden wird, wie in der Referenzfrage auf ServerFault beschrieben.

Was den Streets-Tisch betrifft, ist das ganz einfach! Ich habe nur zwei Städte und fünf Sektoren als Fremdschlüssel. Aber wie wäre es dann mit den Adressen? Die Adressentabelle ist folgendermaßen aufgebaut:

%Vor%

Wie ich auf ServerFault gesagt habe, habe ich etwa 35.000 Adressen einzufügen. Soll ich mir alle IDs merken? = P

Und dann habe ich jetzt die Bürger Leute einzufügen, die eine Verbindung zu den Adressen haben.

%Vor%

Das Einzige, was mir einfällt, ist, die IDs auf statische Werte zu setzen, aber dann verliere ich jegliche Flexibilität, die ich mit meinem früheren Ansatz mit der INSERT..SELECT -Strategie hatte.

Was sind dann meine Optionen?

  1. Ich zwinge die IDs immer gleich zu sein, dann muss ich SET IDENTITY_INSERT ON , damit ich die Werte in die Tabelle zwingen kann, so habe ich immer die gleichen IDs für jede meiner Zeilen, genau wie vorgeschlagen hier .

  2. Wie fügt man INSERT mit Fremdschlüsseln ein? Ich kann nirgends irgendwelche Dokumente darüber bekommen. = (

Danke für Ihre freundliche Unterstützung!

  

BEARBEITEN

     

Ich habe bearbeitet, um die Anweisung BULK INSERT SQL einzuschließen, die es schließlich für mich gemacht hat!

Ich hatte meine Excel-Arbeitsmappe mit den Informationen, die ich einfügen musste, bereit. Also habe ich einfach ein paar zusätzliche Arbeitsblätter erstellt und angefangen, Formeln zu schreiben, um die Informationsdaten in diese neuen Blätter zu "importieren". Ich hatte einen für jede meiner Entitäten.

  1. Straßen;
  2. Adressen;
  3. Bürger.

Was die beiden anderen Entitäten betrifft, war es nicht wert, sie in großen Mengen einzufügen, da ich nur zwei Städte und fünf Sektoren (Städteunterteilungen) einfügen musste. Sobald sowohl die Städte als auch die Sektoren eingefügt waren, notierte ich ihre jeweiligen IDs und begann, meine Datensätze für den Masseneinsatz vorzubereiten. Die Macht von Excel zu verwenden, um die Werte zu berechnen und die Fremdschlüssel zu "importieren", war übrigens ein Reiz von sich. Danach habe ich jedes der Arbeitsblätter in einer separaten CSV-Datei gespeichert. Meine Aufzeichnungen waren dann bereit, zu verdichten.

%Vor%
  
  • FIRSTROW

         

    Gibt die Zeilennummer an, mit der die Einfügung beginnen soll. In meiner Situation enthielten meine CSVs die Spaltenüberschriften, also war die zweite Zeile die erste. Abgesehen davon könnte man vielleicht irgendwo in seiner Akte anfangen wollen, sagen wir die 15. Reihe.

  •   
  • KEEPIDENTITY

         

    Ermöglicht es einem Benutzer, die angegebenen In-File-Entitäts-IDs in Großbuchstaben einzufügen, obwohl die Tabelle eine Identitätsspalte enthält. Dieser Parameter ist identisch mit SET INDENTITY_INSERT my_table ON vor einer Zeileneingabe, wenn Sie mit einer genauen ID einfügen möchten.

  •   

Wie bei den anderen Parametern sprechen sie selbst.

Nachdem dies erklärt wurde, wurde derselbe Code für jede der beiden verbleibenden Entitäten wiederholt, um Adressen und Bürger einzufügen. Und da KEEPIDENTITY angegeben wurde, blieben alle meine Fremdschlüssel still, obwohl meine Primärschlüssel als Identitäten in SQL Server festgelegt wurden.

Nur ein paar Optimierungen, genau das gleiche wie marc_s in seiner Antwort. Importieren Sie Ihre Daten so schnell wie möglich in eine Staging-Tabelle, ohne Einschränkungen. Auf diese Weise werden Sie Ihr Leben viel einfacher machen und dennoch gute Praktiken befolgen. =)

    
Will Marcouiller 05.12.2011, 03:09
quelle

1 Antwort

14

Die Grundidee besteht darin, Ihre Daten in einer Tabelle staging zu platzieren, die keine Einschränkungen, Einschränkungen usw. aufweist. Laden Sie die Daten einfach so schnell wie möglich zusammen.

Sobald Sie die Daten in der Staging-Tabelle haben, dann , müssen Sie sich Sorgen um Einschränkungen usw. machen, wenn Sie die Daten aus der Staging-Tabelle in die realen Tabellen einfügen.

Hier könnten Sie z. B.

  • Fügen Sie nur die Zeilen in Ihre realen Arbeitstabellen ein, die alle Kriterien erfüllen (und in der Staging-Tabelle als "erfolgreich eingefügt" markieren)

  • behandelt alle Zeilen, die in der Staging-Tabelle verbleiben und die nicht von einem Fehler- / Wiederherstellungsprozess eingefügt wurden - was auch immer das sein könnte: einen Bericht mit allen "Problem" -Zeilen drucken und in einen " Fehler Bin "oder was auch immer - ganz bei Ihnen.

Der Schlüsselpunkt ist: Die tatsächliche BULK INSERT sollte in einer völlig unbeschränkten Tabelle sein - einfach die Daten so schnell wie möglich laden - und erst dann in einem zweiten Schritt beginnen, sich um Einschränkungen und Nachschlagedaten und Referenzen und ähnliches zu sorgen das

    
marc_s 05.12.2011, 05:59
quelle