0

MAS200 などの外部ソースから、本番 SQL​​ Server 2005/2008 データベースへのデータ インポートを設計しています。ソースはトランザクション データベースであり、安全/分離されます。定期的なデータ同期が期待されるように、データベースをソースと同期させる必要があります。

CSV、txt ファイルの形式など、任意のタイプのソース データを要求する自由が与えられています。また、同様の構造を持つ別の SQL データベースにソース データを含めることもできます。データをインポートする最善の方法を選択する必要があります。それは定期的で、時間単位または日単位で行われる可能性があります。

私の経験に基づいて、SQL データベースにソース データを用意することが、開始するための最良の方法であると考えています。これまでに導き出した大まかな設計は次のとおりです -

  1. 定期的にソース データベースが外部から読み込まれます (私たちの側ではありません)。
  2. 前処理: ソース テーブル データを洗練する (つまり、トリム、ルックアップ) - 一般的なデータの書式設定と変換
  3. Fetch : レコードをループする CURSOR を作成します。既存のデータを更新して新しいものを挿入する予定なので、少なくとも 2 つの CURSOR ループが 1 つずつ必要になります。
  4. Populate : CURSORループ内でレコードが更新/挿入されます
  5. 後処理: ここでもいくつかの最終調整とルックアップ マッピング (つまり、コードを ID に置き換えます)
  6. Check : 最後に、テーブルの一貫性チェックを実行して、インポートされたデータの整合性を確認します

要約すると、ストアド プロシージャの手順を分割し、それらの手順を 1 つずつ実行する SQL ジョブを作成します。これを行うには、SSIS、データ インポート ウィザードなど、さまざまな方法があることを知っています。

注: データは膨大になります。前回同様のセットアップを行ったときは、データ インポート プロセス全体を完了するのに数分 (約 20 ~ 25 分) かかったので、1 時間ごとのデータ インポートをスケジュールしました。

ありがとうございました。


更新 #1: MERGE コマンドを使用するのが最善と思われることを理解しています。しかし、SQL Server 2005 用に作成しなければならない場合は? 2008年以降は動くと思います。リンクを見つけました -

http://sqlserver-tips.blogspot.com/2006/09/mimicing-merge-statement-in-sql.html

2005 年のその他のアイデアはありますか?

4

3 に答える 3

2

項目 3 と 4 について - SQL Server 2008 を使用している場合は、カーソルとループではなく MERGE コマンドの使用を検討してください。

可能であれば、ソース データベースのそのままのコピーを保持しておくと、データ処理に問題が発生した場合に、原因をより簡単に追跡できます。

于 2011-11-16T13:49:28.220 に答える
0

SQL Server Integration Services の使用を検討しましたか? あなたのプロジェクトはそれに理想的に適しているようです。

私は最近、さまざまなデータ ソース (データベースとファイルの両方) からデータを取得し、それを集計してクリーンアップし、リレーショナル SQL Server 2008 データベースにプッシュするプロジェクトに取り組みました。これは、SSIS では非常に簡単でした。

于 2011-11-16T14:09:17.483 に答える
0

他の人が言ったように、このプロセスでカーソルを使用する必要はありません。また、SSIS はおそらくあなたが考えるよりもこれに適していることに同意します (移植可能で構成可能であるため)。ただし、T-SQL でこれを行う場合は、FETCH ステップを次のように置き換えることをお勧めします。

  1. データを洗練するために使用したステージング テーブルからデータをプルします。
  2. SQL 2008 で MERGE コマンドを使用できない場合は、JOIN を使用して同じことをエミュレートできます。

    -- 更新する行数 SELECT * FROM staging JOIN destination ON staging.ID = destination.ID

    --rows to be insert SELECT * FROM staging JOIN destination ON staging.ID = destination.ID WHERE destination.ID IS NULL

簡単で、カーソルはありません。

于 2011-11-16T14:22:59.463 に答える