Копирование (сотни) таблиц с одного сервера на другой (с помощью SSMS)


27

У меня есть несколько сотен (в настоящее время 466, но постоянно растущих) таблиц, которые мне нужно скопировать с одного сервера на другой.

Мне никогда не приходилось делать это раньше, поэтому я совсем не уверен, как к этому подойти. Все таблицы в одном формате:Cart<Eight character customer number>

Это часть более крупного проекта, в котором я объединяю все эти Cart<Number>таблицы в одну Cartsтаблицу, но это совершенно другой вопрос.

У кого-нибудь есть лучший метод, который я могу использовать для копирования всех этих таблиц? Имена баз данных на обоих серверах одинаковы, если это помогает. И, как я уже говорил ранее, у меня есть saучетная запись, поэтому я могу делать все необходимое для передачи данных из А в Б. Оба сервера также находятся в одной ферме серверов.


2
Возможно, интересен dba.stackexchange.com/questions/30473/…
billinkc

Ответы:


21

Вы можете использовать задачу «Экспорт данных» в SQL Server Management Studio. Щелкните правой кнопкой мыши базу данных в SSMS, выберите «Задачи», а затем «Экспорт данных». Он запустит интерактивный мастер, который позволит копировать таблицы с одного сервера на другой, хотя вам придется пересоздать индексы самостоятельно. Мастер создает временный пакет служб SSIS (хотя вы также можете сохранить его) и работает относительно быстро.


4
Можно также выполнить ту же задачу экспорта через PowerShell, если вы заинтересованы. Аналогичный скрипт для выполнения этого действия есть в моем ответе здесь: dba.stackexchange.com/a/122149/507
Шон Мелтон,

почему импорт / экспорт не копирует индексы и зависимости? не будет ли слишком сложно воссоздать индексы для 466 таблиц?
Вини

@Vini, вы также можете использовать мастер Generate Scripts, который позволяет вам копировать индексы (хотя я не знаю, надежно ли он генерирует скрипт в правильном порядке зависимости - для этого я всегда использовал RedGate SQL Compare).
Аарон Бертран

@AaronBertrand: ОК. У меня тоже был такой же вопрос. Но когда я импортировал даты и времени также был преобразован в smalldatetime
Vini

23

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

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += N'SELECT * INTO [database].dbo.' + QUOTENAME(name)
  + N' FROM [source_linked_server].[database].dbo.' + QUOTENAME(name) + N';'
FROM sys.tables
WHERE name LIKE N'Cart[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]';

PRINT @sql; -- this will only print 8K, enough to spot check
--EXEC [destination_linked_server].master.sys.sp_executesql @sql;

19

Если вы хотите, чтобы что-то, что может быть написано в сценарии, могло быть легко перезапущено при тестировании и внесении небольших изменений, посмотрите мой ответ здесь:

Импорт данных из одной базы данных в другой скрипт

Этот ответ описывает использование хранимой процедуры SQLCLR, которая использует SqlBulkCopyкласс в .NET. Использование этой хранимой процедуры может быть сделано в курсоре, который просматривает таблицы. Это позволяет легко редактировать процесс, а также учитывать новые таблицы или легко исключать одну или несколько таблиц с помощью WHEREусловия в запросе курсора.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.