Come copiare e convalidare i dati da una tabella (tutti varchar) a un'altra (digitato) in C #?

c# entity-framework sqlbulkcopy

Domanda

[nota: deve essere nel codice in quanto non può utilizzare SSIS o simile]

Ho bisogno di copiare in massa i dati da un database all'altro usando C # e EF probabilmente - sebbene questo non sia scolpito nella pietra.

Il problema è che i dati di origine sono tutti in varchar (max) e voglio la destinazione in tipi di dati corretti. La fonte è storica da un vecchio lavoro ETL che funziona molto bene e non posso essere sostituito. Il problema più comune che ho visto è l'alfa nei campi numerici, ad esempio "nessuno" in un campo monetario. Questi stanno bene nella fonte poiché è tutto varchar.

Vorrei copiare i dati e convalidarli:
source -> validate -> destination
nel modo più semplice possibile. Se la convalida fallisce, ho bisogno di conoscere la riga esatta che ha fallito (e idealmente CHE COSA ha fallito) in modo che possa essere riparata manualmente nel sorgente e che i dati vengano copiati nuovamente.

Ci sono circa 50 tavoli che vanno da 10 a 1,7 milioni di righe! Quindi anche la velocità è importante.

Quale sarebbe un modo sensato per avvicinarsi a questo? Crea DTO, attributi di convalida e automap? Due entità EF e una mappa riga per riga e convalidare ciascuna? SPROC e inserto manuale?

Risposta accettata

Fallo in T-SQL con un server collegato .

Vale a dire:

--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

Se non è possibile comunicare direttamente tra i server, eseguire comunque la convalida in SQL, ma utilizzare un client C # per scrivere i dati su disco e premere la funzione di inserimento in blocco sul server di destinazione. Poiché il componente C # non farebbe altro che trasportare i dati, andrei direttamente a un formato utilizzabile da BULK INSERT , Ã la CSV.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché