500 を超えるテーブルのデータベースがあり、古いバックアップからのそのデータベースのコピーがあります。古いデータベースから更新したい新しいデータベースに多くの欠落レコードがあることに気付きました。
別のデータベースからすべてのレコードを更新するベスト プラクティスは何ですか。クエリを使用して個別に実行できますが、時間がかかり、期限があります。これを達成するための代替または最良の方法はありますか。
よろしく
500 を超えるテーブルのデータベースがあり、古いバックアップからのそのデータベースのコピーがあります。古いデータベースから更新したい新しいデータベースに多くの欠落レコードがあることに気付きました。
別のデータベースからすべてのレコードを更新するベスト プラクティスは何ですか。クエリを使用して個別に実行できますが、時間がかかり、期限があります。これを達成するための代替または最良の方法はありますか。
よろしく
最初に指摘しておくべきことは、これは本質的に危険である可能性があるということです。
パフォーマンスのために各テーブルにタイムスタンプが必要です。そうしないと、潜在的なレコード競合の問題が発生する可能性があります。タイムスタンプがなければ、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]
しかし、これらのレコードが欠落している理由を本当に調べたいと思います。おそらく、それらをログ テーブルに挿入して、後で戻って理由を調べられるようにすることもできます。
お役に立てれば。