検索するだけでいつでも答えを見つけることができるので、StackOverflowに質問を投稿する必要はありませんでした。今回だけ、本物のスタンパーを持っていると思います…。
あるSQLServerデータベースから別のデータベースにデータを移動するプロセスを自動化するコードを書いています。いくつかのテーブル間に外部キー関係を持つかなり標準的なSQLServerデータベースがいくつかあります。簡単なもの。私の要件の1つは、行をループしたりカーソルを使用したりせずに、テーブル全体を一挙にコピーする必要があることです。もう1つの要件は、SSISやその他の外部ヘルパーではなく、SQLでこれを実行する必要があることです。
例えば:
INSERT INTO TargetDatabase.dbo.MasterTable
SELECT * FROM SourceDatabase.dbo.MasterTable
それは簡単です。次に、MasterTableのデータを移動したら、子テーブルのデータを移動します。
INSERT INTO TargetDatabase.dbo.ChildTable
SELECT * FROM SourceDatabase.dbo.ChildTable
もちろん、実際にはもっと明示的なSQLを使用しています...すべてのフィールドなどに具体的に名前を付けるようにしていますが、これは単純化されたバージョンにすぎません。とにかく、これまでのところ、...を除いてすべてが順調に進んでいます。
問題は、マスターテーブルの主キーがIDフィールドとして定義されていることです。したがって、MasterTableに挿入すると、新しいテーブルの主キーがデータベースによって計算されます。そこで、これに対処するために、OUTPUT INTOステートメントを使用して、更新された値をTempテーブルに取得しようとしました。
INSERT INTO TargetDatabase.dbo.MasterTable
OUPUT INSERTED.* INTO @MyTempTable
SELECT * FROM SourceDatabase.dbo.MasterTable
それで、ここですべてがバラバラになります。データベースが主キーを変更したので、一時テーブルのどのレコードがソーステーブルの元のレコードと一致するかを一体どうやって把握するのですか?
問題がわかりますか?新しいIDが何であるかはわかっていますが、元のレコードと確実に一致させる方法がわかりません。SQLサーバーでは、INSERTED値を出力できますが、FROMTABLE値をINSERTED値と一緒に出力することはできません。私はトリガーでそれを試しました、私はSPでそれを試しました、私はいつも同じ問題を抱えています。
一度に1つのレコードを更新するだけの場合、INSERTED値を挿入しようとした元のレコードと簡単に一致させて、新旧の主キー値を確認できますが、この要件をバッチで実行する必要があります。
何か案は?
PS:ターゲットまたはソーステーブルのテーブル構造を変更することは許可されていません。