-2

[注: SSIS などを使用できないため、コードにする必要があります]

おそらく C# と EF を使用して、あるデータベースから別のデータベースにデータを一括コピーする必要がありますが、これは確実ではありません。

問題は、ソース データがすべて varchar(max) にあり、宛先を正しいデータ型にしたいことです。ソースは、非常にうまく機能する古い ETL ジョブの履歴であり、交換することはできません。私が見た最も一般的な問題は、数値フィールドのアルファです。たとえば、金額フィールドの「なし」です。これらはすべて varchar であるため、ソースでは問題ありません。

データをコピーして検証したいと思います:
ソース -> 検証 ->
可能な限り簡単な方法で宛先。検証が失敗した場合、ソースで手動で修正し、データを再コピーできるように、失敗した正確な行 (理想的には何が失敗したか) を知る必要があります。

10 ~ 170 万行のテーブルが約 50 あります。そのため、スピードも重要です。

これにアプローチする賢明な方法は何でしょうか?DTO、検証属性、オートマップを作成しますか? 2 つの EF エンティティと行ごとにマップし、それぞれを検証しますか? SPROCと手動挿入?

4

1 に答える 1

2

リンクサーバーを使用して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# コンポーネントはデータを転送するだけなので、CSVのようなBULK INSERTで使用できる形式に直行します。

于 2013-02-27T05:25:07.183 に答える