2017-10-03 4 views
-3

私は500を超えるテーブルのデータベースを持っていますが、今は古いバックアップからそのデータベースのコピーがあります。古いものから更新したい新しいデータベースには多くのレコードが欠落しています。ベストプラクティスは、別のデータベースからすべてのレコードを更新するためにいただきました データベース内のすべてのテーブルを別のデータベースと比較して更新するにはどうすればよいですか?

、私たちは、クエリを使用して、個別にそれを行うことができますが、それは時間がかかりますし、我々は期限があります。これを達成するための代替手段または最良の方法がありますか?指摘する

よろしく

+0

これはあまりにも広い質問です。 IDとの競合がある場合、どのレコードが正しいかをどのように選択するのですか?いくつかのレコードが変更された場合に更新を実行する予定ですか?必要に応じてレコードを削除しますか?主キーに依存する関係を持つレコードを追加する必要があるが、IDは他のレコードによって取得される場合期限までに解決されない問題のように聞こえます。 – Tanner

+0

データベース間でデータを比較できるサードパーティのツールが多数あります。 redgateのSQLデータ比較はその1つです。そのようなものは、あなたがこのタイプのもののための簡単なボタンに近づけるほど近くにあります。スキーマが異なっている場合の処理​​など、非常に複雑です。私は期限が大好きです。私は彼らが飛ぶときに彼らが作る音が好きです。 –

答えて

1

まず最初は、これは本質的に危険な可能性があります。

あなたは、そうでない場合、あなたが潜在的なレコード衝突問題に実行しようとしている、パフォーマンスのために各テーブルにタイムスタンプを持っているしたいと思います。タイムスタンプがなければ、identity_insertsが設定されておらず、データベースバックアップが現在のシステムとは独立して書き込まれていないことを確かめたいと思うでしょう。

しかし、衝突などを避けるために、レコードを特定する場合は、タイムスタンプ、または保証方法を持っている、とあなたが本当にあなた自身をロールバックではなく、利用可能なデータ比較ツールのいずれかを使用したい場合は...

あなたは可能性があり動的問合せを使用してストアド・プロシージャを作成し、INFORMATION_SCHEMA.TABLESを使用して各表を反復処理し、作成された挿入文を実行します。

EXECのsp_execute '' はダイナミッククエリの構造です。問合せの変数を作成し、カーソルを使用してINFORMATION_SCHEMA_TABLESおよびINFORMATION_SCHEMA_TABLESを反復処理してSQL文を構成します。

うまくいけば、それはあなたが効果的に各テーブルの上に、次のような何かをするだろう、動的SQLクエリを構築するのに役立つ十分な情報です:

INSERT INTO TableA(Col1, Col2, ColN) 
SELECT 
    Col1, Col2, ColN 
FROM 
    OldDatabase.TableA 
WHERE 
    TableA.[ID or Timestamp] NOT IN OldDatabase.[ID or TIMESTAMP] 

しかし、あなたは本当にあなたがそれらのレコードが欠落している理由を調べたいです。また、後で戻って理由を調べるために、ロギングテーブルにそれらを挿入することもできます。

これが役に立ちます。

関連する問題