1

私は3つのテーブルを持っています。

1) SourceTable - 一部のデータを含むソース テーブル

2) DestinationTable - ソース テーブルと同じスキーマを持つ宛先テーブル。両方のテーブルに同様の種類のデータがあります

3) FKSourceTable - SourceTable への FK 参照を持つまったく異なるテーブル

4) FKDestinationTable - DestinationTable への FK 参照を持つまったく異なるテーブル。FKSourceTable と同じスキーマを持つ

ここで、一部のデータを SourceTable から DestinationTable に、FKSourceTable から FKDestinationTable に移行するタスクが与えられています。

ただし、DestinationTable に同じ PK を持つ独自のレコードがあり、PK 違反が発生する可能性があるため、主キーを移行できません。

PK の自動 ID 列として DestinationTable を使用し、一括挿入を行う場合、PK 列を指定しないため、自動 ID がそのジョブを実行します。

これは、DestionationTable の新しいレコードがまったく新しい ID を持つことを意味します。

私が抱えている問題は、FKSourceTable を FKDestinationTable に移行するときに FK 参照を維持するにはどうすればよいですか? 次のように DestinationTable に一括挿入を行うと、ID を追跡できなくなります。

INSERT INTO DestionationTable
    (Col1, Col2)
SELECT st.Col1, st.Col2
FROM SourceTable st

(DestionationTable には、Id、Col1、Col2 の 3 つの列があります)

問題は、SSIS やその他の ETL ソリューションを使用できないことです。簡単な SQL スクリプトでこれを行う必要があります。

誰にもこれに取り組むためのアイデアはありますか? OUTPUT INTO などを使用してみましたが、元の ID と新しい ID の間の参照を保持する方法がわかりませんでした

どんな助けでも大歓迎です

なんどんさん、ありがとうございます。

4

2 に答える 2

3

これはおそらく最適な解決策ではありませんが、仕事を成し遂げるはずです。

ID の挿入を無効にし、既にテーブルにあるものに基づいて自分で ID を生成することを考えます。

これが行うことは、ソース データを繰り返し処理し、一度に 1 行ずつ宛先テーブルに挿入することです。

私はこれを自分でテストしていないので、実行する前にこのコードを徹底的に確認してください

declare @col1 varchar(20)
declare @col2 varchar(20)
declare @col3 varchar(20)
declare @new_id int

set identity_insert on

declare source_data cursor for
select col1, col2, colx
from SourceTable

open source_data

fetch next from source_data 
into @col1, @col2, @col3

WHILE @@FETCH_STATUS = 0
begin
  set @new_id = select MAX(ID) + 1 from SourceTable

insert into DestinationTable (ID, col1, col2, col3) values (@new_id,@col1,@col2,@col3)
-- do something similar for FKDestinationTable
insert into FKDestinationTable (ID, col1, col2, col3) values (@new_id,@col1,@col2,@col3)

fetch next from source_data
into @col1, @col2, @col3 
end 

set identity_insert off
于 2013-06-20T09:08:51.313 に答える
0

Destination テーブルの Ident_Current を使用して、Destination テーブルにデータを挿入します。

    DECLARE @ID  INT = IDENT_CURRENT('DestionationTable')

    INSERT INTO DestionationTable
        (ID, Col1, Col2)
    SELECT @ID + ROW_NUMBER() OVER(ORDER BY st.ID),st.Col1, st.Col2
    FROM SourceTable st
    WHERE -----

これで、ソース テーブルの各 ID = 宛先テーブルの ID の情報が得られました。

    SELECT @ID + ROW_NUMBER() OVER(ORDER BY st.ID) [NEW_ID], st.ID [OLD_ID]
    FROM SourceTable st
    WHERE -----

注: これがトランザクションで行われ、トランザクション タイプがこれらのテーブルの使用法に依存することを確認してください。

于 2013-06-19T22:59:09.637 に答える