Wie kopiert und validiert man Daten von einer Tabelle (alle varchar) zu einer anderen (getippt) in C #?

c# entity-framework sqlbulkcopy

Frage

[Anmerkung: muss in Code sein, da SSIS oder ähnliches nicht verwendet werden kann]

Ich muss Daten in großen Mengen von einer Datenbank in eine andere kopieren, wahrscheinlich unter Verwendung von C # und EF - obwohl dies nicht in Stein gemeißelt ist.

Das Problem ist, dass die Quelldaten alle in Varchar (max) sind und ich das Ziel in richtigen Datentypen möchte. Die Quelle stammt aus einem alten ETL-Job, der sehr gut funktioniert und nicht ersetzt werden kann. Das häufigste Problem, das ich gesehen habe, sind Alphas in numerischen Feldern - z. B. "keine" in einem Geldfeld. Diese sind in der Quelle in Ordnung, da es alles Varchar ist.

Ich möchte die Daten kopieren und validieren:
Quelle -> validieren -> Ziel
auf die einfachste Weise möglich. Wenn die Validierung fehlschlägt, muss ich die genaue Zeile kennen, die fehlgeschlagen ist (und idealerweise WAS fehlgeschlagen ist), so dass sie in der Quelle manuell repariert und die Daten erneut kopiert werden können.

Es gibt ungefähr 50 Tische zwischen 10 und 1,7 Millionen Reihen! Also Geschwindigkeit ist auch wichtig.

Was wäre ein vernünftiger Weg, um das zu erreichen? Erstellen Sie DTOs, Validierungsattribute und Automap? Zwei EF-Entitäten, die Zeile für Zeile zugeordnet werden und jeweils validiert werden? SPROC und manuelle Einfügung?

Akzeptierte Antwort

Tun Sie es in T-SQL mit einem Verbindungsserver .

Dh:

--begin a transaction to wrap validation and load
BEGIN TRAN

--Validate that no tickets are set to closed without a completion date
SELECT * 
FROM bigTableOnLocalServer with (TABLOCKX) -- prevent new rows
WHERE ticketState = '1' /* ticket closed */ and CompletionDate = 'open' 

--if validation fails, quit the transaction to release the lock
COMMIT TRAN

--if no rows in result set 1, execute the load
INSERT INTO RemoteServerName.RemoteServerDBName.RemoteSchema.RemoteTable (field1Int, Field2Money, field3text)
SELECT CAST(Field1 as int), 
    CASE Field2Money WHEN 'none' then null else CAST(Field2Money as money) END,
    Field3Text
FROM bigTableOnLocalServer
WHERE recordID between 1 and 1000000

-- after complete, commit the transaction to release the lock
COMMIT TRAN

Wenn Sie nicht direkt zwischen den Servern kommunizieren können, führen Sie die Validierung weiterhin in SQL durch, verwenden Sie jedoch einen C # -Client, um die Daten auf die Festplatte zu schreiben, und drücken Sie die Bulk-Einfügefunktion auf dem Zielserver. Da die C # -Komponente nichts mehr tun würde, als die Daten zu transportieren, würde ich einfach zu einem Format übergehen , das von BULK INSERT , à la CSV, verwendet werden kann.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum