¿Cómo copiar y validar datos de una tabla (todo varchar) a otra (escrito) en C #?

c# entity-framework sqlbulkcopy

Pregunta

[nota: debe estar en el código ya que no se puede usar SSIS o similar]

Necesito realizar una copia masiva de los datos de una base de datos a otra usando C # y EF probablemente, aunque esto no está escrito en piedra.

El problema es que los datos de origen son todos en varchar (max) y quiero el destino en los tipos de datos correctos. La fuente es histórica de un antiguo trabajo de ETL que funciona muy bien y no puedo ser reemplazado. El problema más común que he visto es la alfa en los campos numéricos, por ejemplo, "ninguno" en un campo de dinero. Estos están bien en la fuente, ya que es todo varchar.

Me gustaría copiar los datos y validarlos:
fuente -> validar -> destino
De la forma más sencilla posible. Si la validación falla, entonces necesito saber la fila exacta que falló (y, idealmente, QUÉ falló) para que se pueda corregir manualmente en la fuente y se vuelvan a copiar los datos.

¡Hay alrededor de 50 mesas con rangos de 10 a 1.7M! Así que la velocidad también es importante.

¿Cuál sería una manera sensata de abordar esto? ¿Crear DTO's, atributos de validación y automap? ¿Dos entidades EF y mapear fila por fila y validar cada una? SPROC y manual de inserción?

Respuesta aceptada

Hazlo en T-SQL con un servidor vinculado .

Es decir:

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

Si no puede comunicarse directamente entre los servidores, siga haciendo la validación en SQL, pero use un cliente C # para escribir los datos en el disco y presione la función de inserción masiva en el servidor de destino. Dado que el componente C # no haría nada más que transportar los datos, simplemente iría directamente a un formato utilizable por BULK INSERT , el CSV.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué