Массовое копирование с одного сервера на другой - PullRequest
1 голос
/ 07 апреля 2010

У меня есть одна ситуация, когда мне нужно скопировать часть данных с одного сервера на другой. Схема таблицы точно такая же. Мне нужно переместить частичные данные из источника, которые могут или не могут быть доступны в таблице назначения. Решение, которое я думаю, состоит в том, чтобы использовать bcp для экспорта данных в текстовый (или .dat) файл, а затем перенести этот файл в место назначения, так как оба не доступны одновременно (разные сети), а затем импортировать данные в место назначения. Есть некоторые условия, которые мне нужно выполнить:

  1. Мне нужно экспортировать только список данных из таблицы, а не весь. Мой клиент собирается дать мне идентификаторы, которые необходимо переместить из источника в место назначения. У меня около 3000 записей в основной таблице и столько же в дочерних таблицах. Я ожидаю, что будет перемещено только 300 записей.
  2. Если запись существует в месте назначения, клиент собирается указать, следует ли игнорировать или перезаписывать регистр в регистр. В 90% случаев мы должны игнорировать записи без перезаписи, но регистрировать записи в файле журнала.

Пожалуйста, помогите мне с лучшим подходом. Я думал об использовании BCP с опцией запроса для фильтрации данных, но при импорте, как мне обойти вставку существующих записей? Как мне перезаписать, если это необходимо?

1 Ответ

1 голос
/ 07 апреля 2010

К сожалению, BCPing в таблицу - это все или ничего, вы не можете выбрать строки для ввода.

Что бы я сделал, это. , .

  1. Создать таблицу на источнике база данных, это будет хранить идентификаторы из строк вам нужно двигаться. Вы Теперь можно BCP из строк, которые вы необходимо.
  2. В базе данных назначения создайте новая таблица Work In Progress, и ППГ строк там.
  3. Оказавшись там, вы можете написать скрипт что решит, стоит ли Строка WIP идет в пункт назначения стол или нет.

Надеюсь, это поможет.

Обновление

Под таблицами незавершенного производства (WIP) я не имею в виду таблицы #temp, вы не можете включить BCP во временную таблицу (по крайней мере, я был бы очень взволнован, если бы вы могли).
Я имею в виду таблицу, которую вы создадите с той же структурой таблицы назначения, в которую вставьте bcp, запишите строки WIP в таблицу назначения и затем удалите таблицу WIP.

Вы не сказали, какую СУБД вы используете, предполагая SQL Server, что-то вроде следующего (непроверенный код). , .

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

По проблеме основных / подробных записей (и мы сейчас отходим от темы исходного вопроса, если бы я был вами, я бы открыл новый вопрос для этой темы, вы получите больше ответов, чем просто мой)

Вы можете написать SP, который будет проходить через новые строки для добавления.
Итак, вы перебираете строки в вашей временной таблице (эти строки имеют исходный идентификатор из исходной базы данных), вставляете эту строку в таблицу назначения, используйте SCOPE_IDENTITY , чтобы получить идентификатор недавно вставленный ряд. Теперь у вас есть старый идентификатор и новый идентификатор, вы можете создать оператор вставки, который будет вставлять оператор для строк подробностей, например. , .

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

Надеюсь, что это поможет [если это помогло, вам разрешено проголосовать за этот ответ, даже если это не тот ответ, который вы выберете:)]

Спасибо
BW

...