3

あるシステムから別のシステムにデータを移行していて、インポートするデータを含む CSV ファイルを受け取ります。ファイルには、インポートする最大 100 万件のレコードを含めることができます。ファイルの各行を取得して検証し、データを関連するテーブルに入れる必要があります。たとえば、CSV は次のようになります。

Mr,Bob,Smith,1 high street,London,ec1,012345789,work(this needs to be looked up in another table to get the ID)

実際のファイルには、この例よりも多くのデータがあります。

したがって、SQL は次のようになります。

Declare @UserID
Insert into User
Values ('Mr', 'Bob', 'Smith', 0123456789)
Set @UserID = @@Identity
Insert into Address
Values ('1 high street', 'London', 'ec1', select ID from AddressType where AddressTypeName = 'work')

各行を繰り返し処理し、上記の SQL を含むファイルのパラメーターを使用して SP を呼び出すことを考えていました。これはこれに取り組む最善の方法でしょうか?これはサイトの更新時に 1 回だけ実行されるため、時間は重要ではありません。

C# と SQL Server 2008 R2 を使用しています。

4

2 に答える 2

4

ステージングとして一時テーブルにロードし(これは論理的に一時的である可能性があり、必ずしも技術的には必要ないことに注意してください)、そこから処理します。これは標準のETLの動作です(ETLの場合は100万はごくわずかです)。最初にデータをステージングし、次にデータをクリーンアップしてから、最終的な場所に配置します。

于 2013-01-09T21:50:57.277 に答える
0

この種のタスクを実行する場合、各レコードを個別にローテーションすることは大きなパフォーマンスの問題になるため、考えることはありません。この場合、レコードをステージング テーブルに一括挿入するか、ウィザードを使用してステージング テーブルにインポートします (特にアドレス フィールドのデフォルトの 50 文字に注意してください)。次に、セットベースのコードを記述してクリーンアップを行います。必要性 (不適切な電話番号、郵便番号、電子メール アドレス、州またはレコードを削除する、データベースに必要なフィールドのデータが欠落している、またはルックアップ テーブルを使用してデータを変換する (特定の必須値を含むテーブルがあるとします。このファイルにあるので、変換する必要があります。私たちは医師の専門分野を多く使用しています。そのため、システムはそれらを GP として保存するかもしれませんが、ファイルは General Practioner の値を与える可能性があります。フィールドの一致しない値をすべて調べてから、それらを既存の値にマップできるかどうか、レコードを破棄する必要があるかどうか、またはルックアップ テーブルにさらに値を追加する必要があるかどうかを判断する必要があります。不要なレコードを取り除き、ステージング テーブルにあるレコードをクリーンアップしたら、prod テーブルにインポートします。複数のレコードを書き込む場合は、VALUES 句ではなく、INSERT の SELECT バージョンを使用して挿入を書き込む必要があります。

于 2013-01-09T22:29:10.603 に答える