1

あるサーバーから別のサーバーにデータの一部をコピーする必要がある状況が1つあります。テーブルスキーマはまったく同じです。ソースから部分的なデータを移動する必要があります。これは、宛先テーブルで使用できる場合とできない場合があります。私が考えている解決策は、bcpを使用してデータをテキスト(または.dat)ファイルにエクスポートし、両方に同時にアクセスできないため(異なるネットワーク)、そのファイルを宛先に移動してから、データをにインポートすることです。行き先。私が満たす必要があるいくつかの条件があります:

  1. テーブル全体ではなく、データのリストのみをエクスポートする必要があります。クライアントから、送信元から宛先に移動する必要のあるIDが提供されます。マスターテーブルには約3000のレコードがあり、子テーブルにも同じです。私が期待しているのは、300レコードだけが移動されるということです。
  2. レコードが宛先に存在する場合、クライアントはケースバイケースで無視するか上書きするかを指示します。90%の場合、上書きせずにレコードを無視する必要がありますが、レコードをログファイルに記録します。

最善のアプローチで私を助けてください。BCPとクエリオプションを使用してデータをフィルタリングすることを考えましたが、インポート中に既存のレコードの挿入をバイパスするにはどうすればよいですか?必要に応じて上書きするにはどうすればよいですか?

4

1 に答える 1

1

残念ながら、テーブルへのBCPはオールオアナッシングの取引であり、取り込む行を選択することはできません。

私がすることはです。。。

  1. ソースデータベースにテーブルを作成します。これにより、移動する必要のある行のIDが保存されます。これで、必要な行をBCPアウトできます。
  2. 宛先データベースで、新しい作業中テーブルを作成し、そこに行をBCPします。
  3. そこに入ると、WIP行が宛先テーブルに入るかどうかを決定するスクリプトを書くことができます。

お役に立てれば。

アップデート

仕掛品(WIP)テーブルとは、#tempテーブルを意味するのではなく、一時テーブルにBCPすることはできません(少なくとも、可能であれば非常に驚きます)。
つまり、宛先テーブルと同じ構造で作成するテーブルを意味します。その中にbcpを入れ、宛先テーブルにWIP行をスクリプト化してから、WIPテーブルをドロップします。

SQL Serverを想定して、使用しているRDBMSは、次のようなものではありません(未試行のコード)。。。

-- following creates new table with identical schema to destination table
select * into WIP_Destination from Destination
where 1 = 0

-- BCP in the rows
BULK INSERT WIP_Destination from 'BcpFileName.dat'

-- Insert new rows into Destination
insert into Destination
Select * from WIP_Destination 
where not id  in (select id from Destination)

-- Update existing rows in destination

Update Destination 
set field1 = w.field1, 
    field2 = w.field2, 
    field3 = w.field3, 
    . . . 
from Destination d inner join WIP_Destination w on d.id = w.id

Drop table WIP_Destination

Update 2
OK、一時テーブルに挿入できるように、試してみました(先日時間がありませんでした。申し訳ありません)。

マスター/詳細レコードの問題について(そして、元の質問の主題から外れています。もし私があなたなら、このトピックについて新しい質問を開くと、あなたは私のものよりも多くの答えを得るでしょう)

追加する新しい行をステップスルーするSPを作成できます。
したがって、一時テーブルの行をループし(これらの行にはソースデータベースからの元のIDがあります)、その行をDestinationテーブルに挿入し、SCOPE_IDENTITYを使用して新しく挿入された行のIDを取得します。これで古いIDと新しいIDができたので、のような詳細行のステートメントを挿入する挿入ステートメントを作成できます。。。

insert into Destination_Detail
select @newId, field1, field2 . . . from #temp_Destination_Detail
where Id = @oldId

これがお役に立てば幸いです[選択する回答でなくても、この回答に賛成することが許可されている場合は:)]

ありがとう
BW

于 2010-04-07T12:06:17.253 に答える