残念ながら、テーブルへのBCPはオールオアナッシングの取引であり、取り込む行を選択することはできません。
私がすることはです。。。
- ソースデータベースにテーブルを作成します。これにより、移動する必要のある行のIDが保存されます。これで、必要な行をBCPアウトできます。
- 宛先データベースで、新しい作業中テーブルを作成し、そこに行をBCPします。
- そこに入ると、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