Миграция данных с различными схемами

У меня есть база данных DBv1 на SQL Server, и я хочу перенести данные в нее на DBv2 (в том же поле, сохранить сервер). DBv2 имеет очень похожую схему. Единственная разница в схеме заключается в том, что DBv2 имеет одну меньшую таблицу, потому что она де-нормирована.

Какой был бы наиболее практичный способ переноса данных из DBv1 в DBv2 с учетом изменений в схеме и необходимость какого-либо преобразования?

Есть ли инструмент, который сделает это для меня? Или мне нужно записывать это вручную?

Для пояснения: это одноразовая загрузка только потому, что это просто миграция. По схеме здесь я не ссылаюсь на объект SQL с тем же именем. Скорее, я имею в виду структуру таблиц. Из-за де-нормализации одна таблица удаляется, а новый столбец добавляется в родительскую таблицу, которая будет иметь данные в удаленной таблице.

3
nl ja de
Поскольку вы не можете просто восстановить DBv2, ответ будет несколько зависеть от того, будет ли это одноразовая загрузка или повторяющееся обновление (Примечание: перезагрузка с нуля можно считать разовой нагрузкой.) Для одного -time load, пакет SSIS, вероятно, самый простой способ сделать. Скопируйте один-на-один для всех идентичных таблиц (не забудьте установить идентификатор вставки), затем используйте запрос, который генерирует информацию, которую вы хотите в одной новой таблице из двух старых таблиц, в качестве источника, и загружаете ее в новый трамвай.
добавлено автор Offirmo, источник

4 ответы

Вы можете использовать bcp out и bulk insert для достижения того, что вы пытаетесь сделать.

Вы можете использовать мой скрипт

Создайте папку 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
добавлено

You can use Import/Export in the SSMS for transferring data (right-click a database in Object Explorer -> Tasks -> Import Data.../Export Data ...) - pick SQL connection to DBv1 as a source and DBv2 as a destination and select objects to be transferred along with mapping in the next steps.

Вот учебник по импорту/экспорту от Ray Ячмень

Если у вас есть разница в схеме, вы можете попытаться создать представление, которое будет переводиться в исходную таблицу в соответствии с вашим новым пунктом назначения в 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
добавлено

Благодаря @Kin для ссылки на инструмент bcp. Я смог решить свою проблему с помощью 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
добавлено
SqlCom.ru - Стиль жизни SQL
SqlCom.ru - Стиль жизни SQL
908 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только MS SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz). Предложения в @sql_ninja

SQL_Ninja
SQL_Ninja
340 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz)