sql >> データベース >  >> RDS >> Sqlserver

SQLでカーソルを避けてテーブルをコピーするには?

    output 句を merge ステートメントで使用して、ソース ID とターゲット ID の間のマッピングを取得できます。この質問で説明されています。 使用source.id と target.id の間のマッピングを取得するための merge..output

    テストできるコードを次に示します。実際のテーブルの代わりにテーブル変数を使用しています。

    サンプルデータのセットアップ:

    -- @A と @B はソース テーブルですdeclare @A as table( id int, FK_A_B int, name varchar(10))declare @B as table( id int, visible bit) -- サンプル データ@A および @Bin @B 値 (21, 1),(32, 0) に挿入 @A 値 (1, 21, 'n1'),(5, 32, 'n2') に挿入-- @C および@D is the target tables with id as identity columnsdeclare @C as table( id int identity, FK_C_D int not null, name varchar(10))declare @D as table( id int identity, visible bit) -- サンプルデータはすでに@C と @Dinsert @D の値 (1),(0) に @C の値 (1, 'x1'),(1, 'x2'),(2, 'x3') に挿入  

    データのコピー:

    -- @IdMap は、間のマッピングを保持するテーブルです-- @B.id と @D.id (@D.id は ID 列)declare @IdMap table(TargetID int, SourceID int)-- @B から @D にマージします。@D を D としてマージします -- @B を B として使用するターゲット テーブル -- ソース テーブル 0=1 -- 0=1 は、マージに一致するものがないことを意味します。 visible) values(visible) -- @Doutput insert.id に挿入し、B.id を @IdMap に挿入します。 -- 新しく作成された insert.id をキャプチャし、 -- ソース (@B.id) にマップします。 -- @A から @C に行を追加し、結合して -- @IdMap を使用して、FK 関係の新しい ID を取得しますinsert @C(FK_C_D, name)select I.TargetID, A.name from @A as A 内部結合 @IdMap as I on A.FK_A_B =I.SourceID  

    結果:

    select *from @D as D inner join @C as C on D.id =C.FK_C_Did visible id FK_C_D name----------- ------- - ---------- ----------- ----------1 1 1 1 x11 1 2 1 x22 0 3 2 x33 1 4 3 n14 0 5 4 n2  

    ここでコードをテストできます:https://data.stackexchange.com/stackoverflow/q/101643/using-merge-to-map-source-id-to-target-id



    1. ジェネリックリストC#のSQLServerへの一括挿入

    2. SQL列の区切り値を複数の行に分割する

    3. 結合された要素へのアクセス

    4. PostgreSQLで(タイムゾーンなしで)現在の時刻を取得する方法