2012-04-10 10 views
3

お客様からのデータフィードを受け取り、サードパーティのアプリケーションを使用しているときに顧客側で変更することができますが、毎回ほぼ同じスキーマを取得します。データファイルを受け取ると、各データファイル(生徒、出席者など)のテーブルを使用してステージングデータベースにデータをインポートします。そのデータを、その顧客のデータベースに既に存在するデータと比較して、以前の実行から変更されたデータ(列が変更されたか、行全体が削除された可能性があるか)を確認します。更新された値または削除された行を監査テーブルに書き込んで、以前のデータインポートからどのデータが変更されたかを確認することができます。データ自体を更新する必要はなく、2つのデータセット間で異なるものだけを記録したいだけです。その後、顧客データベースからすべてのデータを削除し、そのまま新しいデータファイルからデータをインポートします(この指示は残されており、変更することはできません)。大きな問題は、テーブルにカスタマイズできるので、私は顧客から得ようとしているスキーマが正確にわからないため、これを動的に行う必要があることです。私は、どのテーブルがデスティネーションにあるのかを動的に判断できるようにする必要があります。そして、そのソースを見て、値を比較して何が変わったのかを確認する必要があります。SQL Serverでソーステーブルとデスティネーションテーブルの行を動的に比較する方法

追加情報: ソースにID列はありませんが、別個の行を構成するサロゲートキーとして使用できる列がいくつかあります。

私は別の参照テーブルの各テーブルの代理キーに対してそれを行う必要がありますが、値をハードコードすることなく、一般的に各テーブルに対してこれを行うことができます。

SSIS、SP、トリガーなどのいずれかを使用することができます。私はタペシフを含むすべてを見てきましたが、私が必要とするすべてのものを持っているようではないか、または論理に入ると非常に複雑になり始めます。

もちろん、誰かがこれまでに行ったような何かの具体的な例は、非常に高く評価されます。

他に役立つ情報があれば教えてください。

おかげ

+0

テーブル/ファイル構造を含めてください。 – Maess

+0

@Maess - あなたはその質問をお読みになりましたか?テーブルが変更されます。 – JonH

+0

すべてのクライアントがファイルを送信します。これらのファイルには共通の列がありますが、クライアントは独自のカスタム列を追加できます。これらのカスタム列のデータは気になりますか?カスタムデータを保持したいと仮定して、各ファイルごとにパーマネントテーブルスキーマを動的に更新する方法について説明しています。 – lyrisey

答えて

1

あなたはキーワードが、これはあなたを表2にないTABLE1のすべてを与え


select col1,col2,... from table1 
except 
select col1,col2,... from table2 

「以外」で異なっているものを見るために2つのテーブルを比較したい場合。


select col1,col2,... from table2 
except 
select col1,col2,... from table1 

これはあなたTABLE1にないtable2の中にすべてを提供します。


2つのテーブルに何らかの種類の便利な永続プライマリキーがあると仮定すると、両方のセットのすべてが変更になります。最初のセットのすべてが挿入物です。 2番目のセットのすべてが削除されます。

+0

これは実際に私が変更したかどうかを確認する必要があった私の記録を絞り込むために使ったアプローチです。 PKはありませんが、データセットの「キー」として定義する列がいくつかあります。別のテーブルに列をリストアップしました。次に、exceptを使用して完全な行を比較し、2つのデータセット(INFORMATION_SCHEMAを使用)で異なる行を取得し、2つのデータセットの「キー」列を比較しました。キーが同じ場合は、変更された行としてカウントし、各列の古い値または新しい値で更新を記録します。 – Rogman

2

私は同様の問題に取り組み、一連のメタデータテーブルを使用してデータセットを動的に比較しました。これらのメタデータテーブルは、どのデータセットをステージングする必要があるか、およびどの列の組み合わせ(およびそのデータ型)が各テーブルのビジネスキーとして機能するかを記述したものです。

このようにして、SQLクエリを動的に構築することができます。、SSISスクリプトコンポーネントを使用して)完全な外部結合を実行して、2つの間の違いを見つけます。

SQL Serverのメタデータ(sys。*またはINFORMATION_SCHEMA。*を使用)を使用して独自のメタデータを結合し、列がソースに存在し、データ型が予期したとおりであるかどうかを検出できます。

評価のために不一致のメタデータをエラーフローにリダイレクトします。

この作業方法は非常に危険ですが、メタデータをうまく管理していれば、この方法を実行できます。

+1

私はinformation_schemaを使用してテーブルの列のリストを取得し、次に以下のようなEXCEPT比較用の列リストを作成しました。これにより、データが更新されたか削除されたかを判断するために、より小さなデータセットが使用され、カーソルで処理されました。私が以前見ていた数百万とは対照的に、数千の行/数千の行を使った方がはるかに優れています。 – Rogman