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

27

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

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

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

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

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

Ответы:

21

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

Alex
источник
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условия в запросе курсора.

Соломон Руцкий
источник