2010-04-07 2 views
1

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

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

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

+0

Обновлен мой ответ, еще раз :) –

ответ

1

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

То, что я хотел бы сделать это. , ,

  1. Создание таблицы в базе данных источника , это будет хранить идентификаторы строк, которые необходимо переместить. Вы можете теперь BCP из строк, которые вам нужны .
  2. В базе данных целевого назначения создайте новую таблицу «Работа в процессе» и BCP.
  3. После этого вы можете написать сценарий , который определит, идет ли строка WIP в пункт назначения , или нет.

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

Update

По незавершенное (WIP) таблицы я не имею в виду #temp таблицы, вы не можете BCP в временную таблицу (по крайней мере, я бы очень sprprised, если вы могли бы) ,
Я имею в виду таблицу, которую вы создадите с той же структурой таблицы назначения, 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 

Update 2
ОК, так что вы можете вставить во временные таблицы, я просто попытался его (у меня не было времени на другой день, извините).

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

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

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

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

Благодаря
BW

+0

Спасибо за ответ. Я думал так же. Создайте таблицу в исходной базе данных и загрузите список перемещаемых записей, используйте запрос вместе с bcp. Для импорта, что я думал, создайте таблицу #temp и импортируйте все данные из .dat-файла с помощью bcp, а затем используйте запрос из #temp в основную таблицу, если записи не существуют в пункте назначения. Стоит ли таблица «Выполняется работа» означает таблицы templ? Но, не уверен, работает ли этот подход или нет. Если кто-то может помочь мне с некоторым синтаксисом, это будет полезно. спасибо – 2010-04-08 08:37:37

+0

Спасибо за ответ. Одно сомнение. Если у меня нет привилегии создавать новые таблицы в целевой системе, я думаю, это не сработает. Итак, что вы говорите, вы не можете bcp на #temp? Еще одно требование вместе с этим: у меня есть мастер-таблица с идентификатором для первичного ключа, и у меня есть несколько дочерних таблиц. Когда я вставляю запись в основную таблицу с помощью BCP, как я могу использовать вновь созданный ID из главной таблицы для вставки связанных дочерних таблиц? Будет ли это возможно? Возможно, я смогу установить личность, но будет ли это работать? спасибо Joseph – 2010-04-09 13:47:21

Смежные вопросы