質問

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

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

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

役に立ちましたか?

解決

残念ながら、テーブルへの BCP 設定は全か無かの取引であり、取り込む行を選択することはできません。

私ならどうしますか?。。

  1. ソースにテーブルを作成する データベースに保存され、これは ID の 移動する必要がある行の。あなたが これで、行をBCPで取り出すことができます。 必要。
  2. 宛先データベースで、進行中の新しい作業テーブルを作成し、そこに行をbcpします。
  3. そこに着いたら、スクリプトを書くことができます これにより、 仕掛品行が宛先に入る テーブル、またはそうではありません。

お役に立てれば。

アップデート

進行中の作業 (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

アップデート 2
OK、一時テーブルに挿入できるので、試してみました(先日は時間がありませんでした、ごめんなさい)。

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

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

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

お役に立てれば [役に立った場合は、選択しようとしている回答ではない場合でも、この回答に賛成票を投じることができます:)]

ありがとう
BW

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top