Может ли BCP копировать данные напрямую из таблицы в таблицу?

У меня возникла ситуация, когда мне нужно скопировать несколько таблиц из одной БД SQL Server в отдельную БД SQL Server. Обе базы данных находятся в одном экземпляре. Таблицы, которые я копирую, содержат минимум 4,5 миллиона строк и имеют размер около 40 ГБ.

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

Это возможно? Если да, то как?

РЕДАКТИРОВАТЬ: Причина, по которой мы не используем простую INSERT, заключается в том, что у нас ограниченное пространство на диске журнала на сервере, который почти мгновенно исчезает при попытке INSERT. Мы попробовали, но запрос быстро замедлился до черепашьей скорости, поскольку диск журналов заполнился.


person GShenanigan    schedule 03.11.2010    source источник
comment
Если это две базы данных в одном экземпляре, почему бы не использовать INSERT?   -  person Tim Robinson    schedule 03.11.2010
comment
Несколько причин, включая скорость работы и количество места на диске журнала. INSERT очень быстро увеличивает файлы журнала, и у нас заканчивается место на диске журнала.   -  person GShenanigan    schedule 03.11.2010
comment
Обычно я делаю такие INSERT партиями, скажем, по 10 000 строк.   -  person Tim Robinson    schedule 03.11.2010
comment
Как скорость операции INSERT обычно сравнивается с BCP при выводе в файл и последующем импорте? Таким образом, по сути, запуская INSERT не менее 45 раз (учитывая количество строк + 4,5 миллиона), каждый раз сжимая файлы журнала после завершения?   -  person GShenanigan    schedule 03.11.2010
comment
BCP вставляет данные пакетами так же, как и с INSERT, и имеет такие же соображения в отношении журнала транзакций. Разница в том, что BCP должен физически копировать данные с сервера базы данных и обратно, тогда как с INSERT вы перемещаете данные внутри сервера.   -  person Tim Robinson    schedule 03.11.2010


Ответы (3)


BCP предназначен для дампа в/чтения из файла. Используйте DTS/SSIS для копирования из одной БД в другую.

Вот документы BCP в MSDN.

person rickythefox    schedule 03.11.2010
comment
Я хотел выяснить, можно ли его использовать для прямого копирования или нет, из этого - нет. К счастью, мне удалось переместить некоторые файлы и освободить достаточно места, чтобы использовать BCP для перемещения данных. Спасибо. - person GShenanigan; 11.11.2010

из моего ответа на резервное копирование на уровне таблицы

Я использую bcp.exe для создания резервных копий на уровне таблиц.

экспортировать:

bcp "select * from [MyDatabase].dbo.Customer " queryout "Customer.bcp" -N -S localhost -T -E

импортировать:

bcp [MyDatabase].dbo.Customer in "Customer.bcp" -N -S localhost -T -E -b 10000

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

person kenwarner    schedule 05.01.2013
comment
Есть ли способ BCP из одной таблицы напрямую в другую, или вам нужно записать файл данных, а затем прочитать из файла данных? - person sooprise; 11.04.2014

Мастер импорта/экспорта SQL выполнит эту работу ... просто дважды подключитесь к одной и той же базе данных (источник и место назначения) и скопируйте одну таблицу в другую (пустую и проиндексированную), вы можете указать игнорировать поле ключа с автоматическим числовым идентификатором, если оно существует. Этот подход работает для меня с таблицами более 1 млн записей.

person Gonzalo    schedule 19.09.2015