web-dev-qa-db-ja.com

異なるスキーマによるデータ移行

SQL ServerにデータベースDBv1があり、そのデータをDBv2(同じボックス、保存サーバー)に移行したい。 DBv2のスキーマは非常に似ています。スキーマの唯一の違いは、正規化されていないため、DBv2のテーブルが1つ少ないことです。

スキーマの変更と変換の必要性を考慮して、DBv1からDBv2にデータを移行する最も実用的な方法は何ですか?

それを行うツールはありますか?それとも手動でスクリプトを作成する必要がありますか?

明確化のために、これは単なるマイグレーションであるため、これは1回限りのロードです。ここでのスキーマでは、同じ名前のSQLオブジェクトを参照していません。むしろ、私はテーブルの構造を参照しています。非正規化により、1つのテーブルが削除され、削除されたテーブルにデータが含まれる新しい列が親テーブルに追加されます。

3
Husain

Bcpツールを参照してくれた@Kinに感謝します。 bcpを使用して問題を解決できました。

私にとってそれを行う方法は、データを結合のクエリとしてエクスポートすることでした

bcp "select A.column1, B.column2 from A join B on A.BId = B.Id" queryout C:\temp\AJoinB.dat -n -S serverHostName -T

その後

bcp MyNewTable in C:\temp\AJoinB.dat -n -S serverHostName -T

そしてそれはそれをしました。

0
Husain

Bcp outと一括挿入を使用して、実行しようとしていることを実現できます。

あなたはできる 私のスクリプトを使用

フォルダを作成しますD:\BCP_OUT\ bcp outファイルが存在するサーバー上でローカルに。

/************************************************************************************************************************************************
Author      :   KIN SHAH    *********************************************************************************************************************
Purpose     :   Move data from one server to another or from one db to another *********************************************************************************************
DATE        :   05-28-2013  *********************************************************************************************************************
Version     :   1.0.0   *************************************************************************************************************************
RDBMS       :   MS SQL Server 2008R2 and 2012 & up  *************************************************************************************************
*************************************************************************************************************************************************/

-- save below output in a bat file by executing below in SSMS in TEXT mode. Review the OUTPUT and run the .bat file. This will create the bcp out files with data in them.
-- clean up: create a bat file with this command --> del D:\BCP_OUT\*.dat 

select '"C:\Program Files\Microsoft SQL Server\100\Tools\Binn\bcp.exe" '-- path to BCP.exe
        +  QUOTENAME(DB_NAME())+ '.'                                    -- Current Database
        +  QUOTENAME(SCHEMA_NAME(SCHEMA_ID))+'.'            
        +  QUOTENAME(name)  
        +  ' out D:\BCP_OUT\'                                           -- Path where BCP out files will be stored
        +  REPLACE(SCHEMA_NAME(schema_id),' ','') + '_' 
        +  REPLACE(name,' ','') 
        + '.dat -T -E -SSERVERNAME\INSTANCE -n'                         -- ServerName, -E will take care of Identity, -n is for Native Format
from sys.tables
where is_ms_shipped = 0 and name <> 'sysdiagrams'                       -- sysdiagrams is classified my MS as UserTable and we dont want it
and schema_name(schema_id) <> 'some_schema_exclude'                     -- Optional to exclude any schema 
order by schema_name(schema_id)                         



--- Execute this on the destination server.database from SSMS.
--- Make sure the change the @Destdbname and the bcp out path as per your environment.

declare @Destdbname sysname
set @Destdbname = 'destination_database_Name'               -- Destination Database Name where you want to Bulk Insert in
select 'BULK INSERT '                                       -- Remember Tables **must** be present on destination Database
        +  QUOTENAME(@Destdbname)+ '.'
        +  QUOTENAME(SCHEMA_NAME(SCHEMA_ID))+'.' 
        +  QUOTENAME(name) 
        + ' from ''D:\BCP_OUT\'                             -- Change here for bcp out path
        +  REPLACE(SCHEMA_NAME(schema_id),' ','') + '_'
        +  REPLACE(name,' ','') 
        +'.dat'' 
        with (
        KEEPIDENTITY,
        DATAFILETYPE = ''native'',  
        TABLOCK
        )'  + char(10) 
        + 'print ''Bulk insert for '+REPLACE(SCHEMA_NAME(schema_id),' ','') + '_'+  REPLACE(name,' ','')+' is done... '''+ char(10)+'go' 
from sys.tables
where is_ms_shipped = 0 and name <> 'sysdiagrams'           -- sysdiagrams is classified my MS as UserTable and we dont want it
and schema_name(schema_id) <> 'some_schema_exclude'         -- Optional to exclude any schema 
order by schema_name(schema_id)
3
Kin Shah

SSMSでインポート/エクスポートを使用してデータを転送できます(オブジェクトエクスプローラーでデータベースを右クリック->タスク->データのインポート... /データのエクスポート...)-DBv1へのSQL接続をソースとして、DBv2を次のステップで、宛先とともにマッピングとともに転送するオブジェクトを選択します。

レイ・バーリーによるインポート/エクスポートのチュートリアルです

スキーマに違いがある場合は、DBv2の新しい宛先に従ってソーステーブルで変換するビューを作成し、インポート/エクスポートダイアログで宛先の適切なオブジェクトにマップすることをお勧めします。

1

おそらく、これを行うための最も簡単な方法は、DBv1のコピーをDBv2として復元し、列を追加して保持するようにテーブルを変更してから、ドロップするテーブルからデータをコピーすることです。新しい列。

たとえば、次のようなもの:

CREATE TABLE dbo.retain
(
    retain_id int NOT NULL
        PRIMARY KEY CLUSTERED
    ...cols...
);

CREATE TABLE dbo.to_be_dropped
(
    to_be_dropped int NOT NULL
        PRIMARY KEY CLUSTERED
    , retain_id int NOT NULL
        FOREIGN KEY 
        REFERENCES dbo.retain(retain_id)
    , someData varchar(30) NOT NULL
);

ALTER TABLE dbo.retain
ADD someData varchar(30) NOT NULL;

UPDATE dbo.retain
SET someData = tbd.someData
FROM dbo.retain r
    INNER JOIN dbo.to_be_dropped tbd ON r.retain_id = tbd.retain_id;

データが正しくコピーされたことを確認したら、不要なテーブルを削除します。

DROP TABLE dbo.to_be_dropped;
0
Max Vernon