あるサーバーから別のサーバーへの一括コピー
-
25-09-2019 - |
質問
データの一部をあるサーバーから別のサーバーにコピーする必要がある状況があります。テーブルスキーマはまったく同じです。部分的なデータをソースから移動する必要がありますが、そのデータは宛先テーブルで使用できる場合とできない場合があります。私が考えている解決策は、bcpを使用してデータをテキスト(または.dat)ファイルにエクスポートし、両方に同時にアクセスできないため(異なるネットワーク)、そのファイルを宛先に持って行き、データを行き先。満たさなければならない条件がいくつかあります。
- テーブルからデータ全体ではなく、データのリストのみをエクスポートする必要があります。クライアントは、ソースから宛先に移動する必要がある ID を私に提供する予定です。マスターテーブルには約3000のレコードがあり、子テーブルにも同じがあります。私が期待しているのは、移動されるレコードは 300 件のみであるということです。
- 宛先にレコードが存在する場合、クライアントはケースごとに無視するか上書きするかを指示します。90% の場合、レコードを上書きせずに無視する必要がありますが、レコードをログ ファイルに記録します。
最善のアプローチを教えてください。データをフィルタリングするためにクエリ オプションを指定した BCP を使用することを考えましたが、インポート中に既存のレコードの挿入を回避するにはどうすればよいですか?必要な場合、どうすれば上書きできますか?
解決
残念ながら、テーブルへの BCP 設定は全か無かの取引であり、取り込む行を選択することはできません。
私ならどうしますか?。。
- ソースにテーブルを作成する データベースに保存され、これは ID の 移動する必要がある行の。あなたが これで、行をBCPで取り出すことができます。 必要。
- 宛先データベースで、進行中の新しい作業テーブルを作成し、そこに行をbcpします。
- そこに着いたら、スクリプトを書くことができます これにより、 仕掛品行が宛先に入る テーブル、またはそうではありません。
お役に立てれば。
アップデート
進行中の作業 (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