Frage

Ich habe eine Situation, wo ich brauche einen Teil der Daten von einem Server auf einen anderen zu kopieren. Das Tabellenschema ist genau gleich. Ich muß teilweise Daten von der Quelle bewegen, die nicht in der Zieltabelle vorhanden sind oder nicht. Die Lösung, die ich denken bin, ist, verwenden Sie bcp Export von Daten in einem Text (oder .dat-Datei) und nehmen Sie dann die Datei an das Ziel, da beide zur gleichen Zeit nicht zugänglich sind (unterschiedliche Netzwerk), dann die Daten an die importieren Ziel. Es gibt einige Bedingungen Ich muss genügen:

  1. Ich brauche nur eine Liste der Daten aus der Tabelle zu exportieren, nicht ganz. Mein Mandant wird mir IDs geben, die von der Quelle zum Ziel verschoben werden muss. Ich habe rund 3000 Datensätze in der Haupttabelle, und glich in den untergeordneten Tabellen zu. Was ich erwarte, ist, nur 300 Datensätze verschoben werden.
  2. Wenn der Datensatz in dem Ziel vorhanden ist, wird der Client geht zu instruieren, ob zu Fall ignorieren oder zu überschreiben Fall. 90% der Zeit, müssen wir die Aufzeichnungen ohne zu überschreiben, ignorieren, aber die Datensätze in einer Protokolldatei protokollieren.

Bitte helfen Sie mir mit dem besten Ansatz. Ich dachte an BCP mit Abfrageoption unter Verwendung der Daten zu filtern, aber während des Imports, wie kann ich Bypass die vorhandenen Datensätze einfügen? Wie kann ich überschreiben, wenn das nötig ist?

War es hilfreich?

Lösung

Leider in eine Tabelle BCPing ist ein alles oder nichts viel, Sie keine Zeilen auswählen können in zu bringen.

Was ich tun würde ist. . .

  1. Erstellen Sie eine Tabelle auf der Quelle Datenbank, speichert diese die IDs die Zeilen müssen Sie sich bewegen. Du BCP aus können nun die Zeilen, die Sie Notwendigkeit.
  2. Auf der Zieldatenbank erstellen eine neue Work In Progress-Tabelle und BCP die Zeilen drin.
  3. Sobald dort ein Skript schreiben das wird entscheiden, ob ein WIP Reihe geht in das Ziel Tabelle oder nicht.

Hope, das hilft.

Aktualisieren

Mit dem in Arbeit (WIP) Tabellen ich nicht gemein #temp Tabellen, können Sie nicht BCP in eine temporäre Tabelle (zumindest würde ich sehr sprprised werden, wenn Sie könnten).
Ich meine, eine Tabelle, die Sie mit der gleichen Struktur der Zieltabelle, bcp in dem schaffen würden, Skript die WIP Zeilen in die Zieltabelle dann die WIP Tabelle löschen.

Sie haben nicht gesagt, was RDBMS Sie verwenden, vorausgesetzt, SQL Server, so etwas wie die folgenden (untried-Code). . .

-- following creates new table with identical schema to destination table
select * into WIP_Destination from Destination
where 1 = 0

-- BCP in the rows
BULK INSERT WIP_Destination from 'BcpFileName.dat'

-- Insert new rows into Destination
insert into Destination
Select * from WIP_Destination 
where not id  in (select id from Destination)

-- Update existing rows in destination

Update Destination 
set field1 = w.field1, 
    field2 = w.field2, 
    field3 = w.field3, 
    . . . 
from Destination d inner join WIP_Destination w on d.id = w.id

Drop table WIP_Destination

Update 2
OK, so dass Sie in temporäre Tabellen einfügen können, habe ich versucht, es nur (ich habe keine Zeit, den anderen Tag habe, sorry).

Auf dem Problem des Master / Detail Records (und wir jetzt das Thema der ursprünglichen Frage Losfahren, wenn ich Sie wäre, würde ich eine neue Frage zu diesem Thema öffnet, werden Sie mehr Antworten als nur Mine)

Sie können einen SP schreiben, die durch die neuen Zeilen Schritt wird hinzuzufügen.
Also, Sie Looping durch die Zeilen in der temporären Tabelle (diese Zeilen haben die Original-ID auf sich aus der Quelldatenbank), Einsatz dieser Zeile in die Zieltabelle, verwenden Sie SCOPE_IDENTITY die ID der neu eingefügte Zeile zu erhalten. Jetzt haben Sie die alte Id und die neue ID, können Sie eine INSERT-Anweisung erstellen, die Anweisung für die Detailzeilen wie einfügen wird. . .

insert into Destination_Detail
select @newId, field1, field2 . . . from #temp_Destination_Detail
where Id = @oldId

Hope, das hilft [wenn es geholfen hat, dürfen Sie diese Antwort upvote, auch wenn es nicht die Antwort, die Sie wählen gehen:)]

Danke
BW

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top