-2

[注意:需要在代码中,因为不能使用 SSIS 或类似的]

我可能需要使用 C# 和 EF 将数据从一个数据库批量复制到另一个数据库——尽管这并不是一成不变的。

问题是源数据都在 varchar(max) 中,我希望目标数据类型正确。来源是来自旧的 ETL 工作的历史记录,该工作运行良好,我无法被替换。我见过的最常见的问题是数字字段中的字母 - 例如货币字段中的“无”。这些在源代码中都很好,因为它都是 varchar。

我想以 最简单的方式复制数据并验证它:
源-> 验证-> 目的地。
如果验证失败,那么我需要知道失败的确切行(理想情况下是什么失败),以便可以在源中手动修复它,并重新复制数据。

大约有 50 个表,行数在 10 到 170 万行之间!所以速度也很重要。

解决这个问题的明智方法是什么?创建 DTO、验证属性和自动映射?两个 EF 实体并逐行映射并验证每个实体?SPROC 和手动插入?

4

1 回答 1

2

在 T-SQL 中使用链接服务器执行此操作。

IE:

--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可用的格式,例如 CSV。

于 2013-02-27T05:25:07.183 回答