2010-12-14 7 views
3

ich einen ETL-Job schreibe, in C#, mit Rhino ETLRhinoETL - Join zwei Tabellen als Eingabe, schreiben Sie an zwei Tabellen auf Ausgabe

ich eine Datenbank auf ServerA haben. Dies hat zwei Tabellen:

(Beispiel)

tblOrder

  • OrderID
  • Kundenname
  • CustomerEmailAddress
  • Übertragene

tblOrderLine

  • OrderID
  • ProductID
  • Product
  • Preis

auf ServerB, hat es eine identische Tabelle (Aufträge von Web übertragen werden, zu unserem Backend System)

Mit RhinoETL, mein InputCommandOperation sieht derzeit wie:

class ReadOrdersFromWebDB : InputCommandOperation 
{ 
    public ReadOrdersFromServerA(ConnectionStringSettings connectionStringSettings) 
     : base(connectionStringSettings) { } 

    protected override Row CreateRowFromReader(IDataReader reader) 
    { 
     return Row.FromReader(reader); 
    } 

    protected override void PrepareCommand(IDbCommand cmd) 
    { 
     cmd.CommandText = "SELECT TOP 10 * FROM tblOrders WHERE Transferred = 0"; 
    } 
} 

Da es keine Transformationen sind in diesem Stadium zu tun, mein OutputCommandOperation wird wie folgt aussehen:

class WriteOrdersToServerB : OutputCommandOperation 
{ 
    protected override void PrepareCommand(IDbCommand cmd, Row row) 
    { 
     cmd.CommandText = 
@"INSERT INTO etc..........."; 
    } 
} 

Was ich will, ist, dies zu tun ändern process, um auch die tblOrderLine-Details von ServerA zu bekommen - wenn möglich, ohne eine Sekunden-Abfrage auf der db (join) Ich bin bestrebt zu vermeiden, eine "Übertragen" -Spalte in der TblOrderLine-Tabelle, und würde lieber den InputCommand zu ändern schließen Sie eine Verbindung ein.

Wie funktioniert die Einfügeoperation nach einem Join im InputCommand? Ist das überhaupt möglich?

Antwort

0

Mein Verständnis ist, dass Sie 2 Tabellen, die Sie von ServerA auf ServerB hochladen möchten und wenn möglich, die 2 Tabellen von ServerA zusammenführen und sie wieder in 2 Tabellen in ServerB teilen.

Wenn die Beziehung zwischen tblOrder und tblOrderLine 1 zu vielen ist, dann vergessen Sie einfach, sie zu verbinden. Es erzeugt redundante Daten, ganz zu schweigen davon, dass ein SELECT TOP n dazu führt, dass einige Elemente von tblOrderLine ignoriert werden. Wenn die Beziehung zwischen den 2 Tabellen 1 zu 1 ist, dann ist es möglich, aber ich bin mir nicht sicher, dass es effizienter wäre, als die 2 Tabellen einzeln abzufragen.

Sie können die Verwendung eines Übergabeflagers in tblOrderLine vermeiden, indem Sie die Bestellnummern, die Sie aus tblOrder extrahieren, in einer Liste speichern und dann tblOrderLine für diese bestimmten Bestellnummern abfragen.

SELECT TOP 10 * 
FROM tblOrder 
WHERE Transferred = 0 

Speichern Sie die Liste der OrderID, die in diesen Daten gefunden wird, und fragen Sie tblOrderLine danach ab.

SELECT * 
FROM tblOrderLine 
WHERE OrderID IN /* list of saved OrderID */