Копіювання (сотні) таблиць з одного сервера на інший (за допомогою SSMS)


27

У мене є кілька сотень (наразі 466, але постійно зростаючих) таблиць, які я повинен копіювати з одного сервера на інший.

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

Це частина більшого проекту, з якого я об'єдную всі ці Cart<Number>таблиці в одну Cartsтаблицю, але це зовсім інше питання.

У когось є метод найкращої практики, який я можу використовувати для копіювання всіх цих таблиць? Імена бази даних на обох серверах однакові, якщо це допомагає. Як я вже говорив раніше, у мене є saобліковий запис, тому я можу робити все необхідне, щоб отримати дані від А до В. Обидва сервери також знаходяться в одній фермі серверів.


2
Можливо, цікавить dba.stackexchange.com/questions/30473/…
billinkc

Відповіді:


21

Ви можете використовувати завдання "Експорт даних" студії управління SQL Server. Клацніть правою кнопкою миші на базі даних в SSMS, виберіть Завдання, а потім «Експорт даних». Він запустить інтерактивний майстер, який дозволить копіювати таблиці з одного сервера на інший, хоча індекси вам доведеться відтворити самостійно. Майстер створює тимчасовий пакет SSIS (хоча ви також можете вирішити, щоб зберегти його) і є відносно швидким.


4
Ви також можете виконати те саме завдання експорту через PowerShell, якщо вам цікаво. Аналогічний сценарій для виконання цієї дії є у ​​моїй відповіді тут: dba.stackexchange.com/a/122149/507
Шон Мелтон

чому імпорт / експорт не копіює індекси та залежності? не було б занадто складно відтворити індекси для 466 таблиць?
Vini

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

@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.