1

データを入力するデスクトップ アプリケーションがあり、MS Access DB にキャプチャされています。アプリケーションは複数のユーザーによって (異なる場所で) 使用されています。アイデアは、その特定の日に入力されたデータを Excel シートにダウンロードし、MSSQL サーバー インスタンスである中央サーバーにロードすることです。つまり、データ (Excel シートの形式) は複数の場所から取得され、サーバーの共有フォルダーに保存され、SQL Server にロードする必要があります。MSSQL サーバー テーブルには IDENTITY を持つ ID 列があり、これが主キー列であり、テーブルには一意の値を含む他の列はありません。データは複数のソースから取得されますが、単一の自動更新シリーズ (IDENTITY) を維持する必要があります。

2 つのソースがある場合、Source1: その日に 100 件のレコードが入力されているとします。Source2: 1 日に 200 件のレコードが入力されています。

それらが Destination(SQL Server) に読み込まれると、テーブルには 300 のレコードがあり、ID 列の値は 1 から 300 です。

また、翌日、データがソースから来る場合、宛先は 301 ID 列からデータをロードする必要があります。

問題は、中央サーバーに既にロードされているソースでデータを変更する要求がいくつかある可能性があることです。そのため、ID 列の値がソースと宛先で同じにならないため、中央サーバーでその行のデータを更新する方法を教えてください。前述のように、ID はテーブル内の唯一の一意の値の列です。

これを行うためのいくつかのアイデアを提案してください。そうしないと、このタスクを達成するために別のアプローチを取る必要があります。

前もって感謝します!クリシュナ

4

1 に答える 1

1

まず、.NET を提案し、ファイル ストリーム リーダーを使用して、さまざまなソースからの複数の DataTables を持つ DataSet 内の ADO.NET の切断されたレイヤーにダンプします。しかし...あなたはSSISについて言及したので、私はその道を進みます。

  1. Business Intelligence Development Studio (BIDS) で SSIS プロジェクトを作成します。

  2. Excelファイルのインポートを大量に行っているだけであることがわかっている場合は、多くの「データフロータスク」または多くのソースから宛先へのタスクを単一の「データフロータスク」で作成します。

    a. 個人的には、Excel ファイルの場所ごとにデータベースにテーブルを作成し、それらの列をマップします。理由は後で説明します。

    b. データ フロー タスクで、ソース ファイルとして [Excel ソース] を選択します。Excel ソースをダブルクリックして、「新しい接続」の適切な場所に配置します。

    c. ADO ネット宛先を選択し、青色の線を Excel ソースからこのエンドポイントにドラッグします。

    d. 宛先を、SQL からマップするテーブルになるようにマップします。

    e. Excel の宛先ごとに必要に応じて繰り返します

  3. SSIS タスクをセットアップして、SQL Server から SQL Management Studio を介して自動化します。データベース インスタンスではなく、統合インスタンスに接続することを忘れないでください。

  4. さて、1 つの大きなテーブルではなく、たくさんのテーブルがありますか? これらはエントリポイントであり、重複を判断するロジックと、別のテーブルに残す時間をインポートするための理由でこれを行いました。

  5. ロジックの組み合わせと後で監査するために、さらに 2 つのテーブルを設定します。

    a. 「インポート」などのようなテーブルを作成し、「ExcelFileLocation」、「DateImported」の 3 つの列を追加することを除いて列を同じにします。最初の列として「identity」列を作成し、デフォルトの (1,1) でシードし、主キーを割り当てます。

    b. 「ImportDupes」などの 2 番目のテーブルを作成し、列に対して上記のプロセスを繰り返します。

    c. インポートを一意にする値または値のセットの最初のテーブルに一意の制約を作成します。

    c. 1つの「インポート」場所に挿入するExcelファイルに一致する多数のテーブルから挿入を行うために、SQLで「手順」を記述します。多くの挿入で、次のようなプロセスを実行します。

    Begin try
       Insert into Imports (datacol1, datacol2, ExcelFileLocation, DateImported) values
       Select datacol1, datacol2, (location of file), getdate()
       From TableExcel1
    End try
    
    -- if logic breaks unique constraint put it into second table
    Begin Catch
       Insert into ImportDupes (datacol1, datacol2, ExcelFileLocation, DateImported)  values
       Select datacol1, datacol2, (location of file), getdate()
       From TableExcel1
    End Catch
    
    -- repeat above for EACH excel table
    
    -- clean up the individual staging tables for the next import cycle for EACH excel table
    truncate TableExcel1
    

    d. オフにする手順を自動化する

  6. これで 2 つのテーブルができました。1 つは正常なインポート用で、もう 1 つは重複用です。

私がしたことをした理由は2つあります。

  1. いつ、どのソースから来たのか、重複していたのか、数百万行に対してこれを行うと、簡単にインデックスを作成できますか?

  2. このモデルは、分解して自動化するのが簡単です。設定するのは手間がかかるかもしれませんが、部品が壊れた場合は、セクションのコードをオフにすることで、どこにあるかを確認し、1 つの場所のインポートを簡単に停止できます。

于 2013-03-19T16:39:47.540 に答える