Как скопировать и проверить данные из одной таблицы (все varchar) на другую (набрав) на C #?

c# entity-framework sqlbulkcopy

Вопрос

[примечание: должно быть в коде, поскольку он не может использовать SSIS или аналогичный]

Мне нужно массово копировать данные из одной базы данных в другую, используя C # и EF, возможно, хотя это не отлито из камня.

Проблема в том, что исходные данные все в varchar (max), и я хочу, чтобы адресат был в правильных типах данных. Источник является историческим из старой работы ETL, которая работает очень хорошо, и я не могу заменить ее. Самая распространенная проблема, которую я видел, - это альфа в числовых полях - например, «нет» в денежном поле. Это нормально в источнике, так как это все варчар.

Я хотел бы скопировать данные и проверить их:
source -> validate -> destination
самым простым способом. Если проверка не удалась, мне нужно знать, какая строка не удалась (и, в идеале, ЧТО), чтобы ее можно было вручную зафиксировать в источнике, а данные были скопированы повторно.

Существует около 50 таблиц размером от 10 до 1,7 млн. Строк! Поэтому скорость также важна.

Каким будет разумный способ приблизиться к этому? Создать DTO, атрибуты проверки и automap? Два объекта EF и карта по очереди за строкой и проверка каждого? SPROC и ручная вставка?

Принятый ответ

Сделайте это в T-SQL со связанным сервером .

То есть:

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

Если вы не можете напрямую связываться между серверами, по-прежнему выполняйте проверку в SQL, но используйте клиент C # для записи данных на диск и нажмите кнопку «Массовая вставка» на целевом сервере. Поскольку компонент C # не будет ничего больше, чем переносить данные, я просто перейду прямо к формату, который можно использовать BULK INSERT , Ã la CSV.



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему