web-dev-qa-db-ja.com

SQL Server-あるデータベースから別のデータベースにデータをコピー-同一のテーブル、新しいID値が必要

これが事実です。私は2つの異なる地理的領域に対して自分のWebサイトの同一のコピーを実行しています。現在、サイトは複数通貨の価格設定をサポートしているので、両方のサイトをマージしたいと思います。

マージする必要があるすべてのテーブルはIDベースであり、愚かにもデータベースの各コピー内の一致するテーブルは同じ数でシードされました。

あるデータベースから別のデータベースにデータを同時にコピーして、参照されるテーブルの外部キー値にも反映される新しいID値をコピーデータに与える方法はありますか?

つまり.

Account
- Id
- Email
- FirstName
- etc

AccountImage
- Id
- Account_id
- FileName
- etc

等々..

3
Jordan

私が何かを見逃していない限り、あなたの問題はデータを移動していないのではなく、すでに設定されているID値を処理しています。その場合は、これを試してください。

  1. いずれかのDBで現在のID値より大きい値を選択してください。丸めの値、たとえば1,000,000を選びます。
  2. 変更するID値を選択します(たとえば、両方のDBで同じルックアップテーブルがある場合、おそらくそれらを同じままにする必要があります)。
  3. データを移動するときは、手順1で選択した値を、移動するときに変更するidents値に追加します。

値に一貫性がある限り、すべての関係を追加しても、結合されたDBには同じままです。だから例えば

現在の最大IDがDB Aに200,000、DB Bに1,400,000の従業員テーブルがあります。データの移動を減らすため、データをDB AからDB Bに移動することにしました。従業員テーブルを移動すると、Employee_Id列に2,000,000が追加されます。

USE DatabaseB
GO

SET IDENTITY_INSERT Employee ON

INSERT INTO Employee (Employee_Id, Other_Columns)
SELECT Employee_Id + 2000000, Other_Columns
FROM DatabaseA.dbo.Employee

SET IDENTITY_INSERT Employee OFF
GO

そして、最後のアドバイスは、間違えた場合に備えて、始める前にすべてをバックアップします:)

7
Kenneth Fisher

両方のデータベースが同じサーバーで、両方のデータベースにアクセスする権限がある場合

方法1:

メインデータベース全体をスクリプト化して新しいデータベース名で実行すると、メインデータベースのスキーマとデータが同じになります(SQL Server 2008バージョン以降で可能)

方法2:

スキーマ、リレーションシップ、データを含むいくつかのテーブルのみが必要な場合は、メインデータベースからスクリプトを作成します

テーブル階層をたどる-1.マスターテーブル2.チャイルドテーブル

  1. スクリプトテーブルスキーマ
  2. スクリプトテーブルデータ
  3. スクリプトテーブルの関係と制約

同じ順序で実行します

方法3:

テーブルのスキーマとデータのみが必要な場合は、IMPORT/EXPORT

0
sairam

おそらく最も簡単な方法は、挿入...選択を行い、同時にset identity_insert onを使用して再参照し、既存のIDに固定値を追加して、データセット間の競合を確実に防ぐことです。

このようなもの:

set identity_insert myTable on

insert into db1.dbo.myTable
( identity_column, [column, column...] )
select identity_column+1000, [column, column...]
from db2.dbo.myTable

set identity_insert myTable off
0
paulH