Экспортировать данные таблицы с одного SQL Server на другой
У меня есть два SQL-сервера (версия 2005 года).
Я хочу перенести несколько таблиц из одного в другое.
Я пробовал:
-
На исходном сервере я щелкнул правой кнопкой мыши по базе данных, выбрав Tasks/Generate scripts
.
Проблема в том, что в Table/View options
нет опции Script data
.
-
Затем я использовал Script Table As/Create script
для генерации SQL файлов для создания таблиц на моем конечном сервере. Но мне все еще нужны все данные.
Затем я попытался использовать:
SELECT *
INTO [destination server].[destination database].[dbo].[destination table]
FROM [source server].[source database].[dbo].[source table]
Но я получаю ошибку:
Объект содержит больше, чем максимальное количество префиксов. Максимум 2.
Может ли кто-нибудь указать мне правильное решение моей проблемы?
Ответы
Ответ 1
Попробуйте следующее:
-
создайте свою таблицу на целевом сервере, используя ваши сценарии с шага Script Table As / Create Script
-
на целевом сервере, вы можете затем выпустить инструкцию T-SQL:
INSERT INTO dbo.YourTableNameHere
SELECT *
FROM [SourceServer].[SourceDatabase].dbo.YourTableNameHere
Это должно работать нормально.
Ответ 2
Просто, чтобы показать еще один вариант (для SQL Server 2008 и выше):
- щелкните правой кнопкой мыши по базе данных → выберите "Задачи" → выберите "Сгенерировать скрипты"
- Выберите конкретные объекты базы данных, которые вы хотите скопировать. Скажем, одну или несколько таблиц. Нажмите "Далее"
- Нажмите "Дополнительно" и прокрутите вниз до "Типы данных до script" и выберите "Схема и данные". Нажмите OK
- Выберите, где сохранить сгенерированный script, и нажмите "Далее"
Ответ 3
В таблице "Задачи/Генерация скриптов" есть таблица script. Я тоже пропустил это в начале! Но вы можете создавать там скрипты вставки (очень приятная функция, но в очень неинтуитивном месте).
Когда вы переходите к пункту "Задать параметры сценариев", перейдите на вкладку "Дополнительно".
Шаги, описанные здесь (фотографии могут понять, но я пишу там на латышском языке).
Ответ 4
Попробуйте использовать Мастер импорта и экспорта (в разделе Задачи → Экспорт данных).
Он предлагает создать таблицы в базе данных назначения. Принимая во внимание, что, как вы видели, мастер сценариев может создавать структуру таблицы.
Ответ 5
Если таблицы уже созданы с использованием сценариев, то есть другой способ скопировать данные с помощью команды BCP для копирования всех данных с исходного сервера на конечный сервер.
Чтобы экспортировать данные таблицы в текстовый файл на исходном сервере:
bcp <database name>.<schema name>.<table name> OUT C:\FILE.TXT -c -t -T -S <server_name[ \instance_name]> -U <username> -P <Password>
Чтобы импортировать данные таблицы из текстового файла на целевом сервере:
bcp <database name>.<schema name>.<table name> IN C:\FILE.TXT -c -t -T -S <server_name[ \instance_name]> -U <username> -P <Password>
Ответ 6
Это можно сделать с помощью "Импорт/экспорт данных..." в SQL Server Management Studio
Ответ 7
Вы не можете выбрать сервер источника/назначения.
Если базы данных находятся на одном сервере, вы можете сделать это:
Если столбцы таблицы равны (включая порядок!), вы можете сделать это:
INSERT INTO [destination database].[dbo].[destination table]
SELECT *
FROM [source database].[dbo].[source table]
Если вы хотите сделать это, как только сможете создать резервную копию/восстановить исходную базу данных.
Если вам нужно делать это чаще, я рекомендую вам запустить проект SSIS, где вы определяете исходную базу данных (там вы можете выбрать любое соединение на любом сервере) и создать проект, в котором вы перемещаете свои данные.
См. Дополнительную информацию здесь: http://msdn.microsoft.com/en-us/library/ms169917%28v=sql.105%29.aspx
Ответ 8
Просто для ударов.
Так как я не смог создать связанный сервер, и поскольку простое подключение к производственному серверу было недостаточно для использования INSERT INTO
, я сделал следующее:
- создана резервная копия базы данных производственного сервера
- восстановил базу данных на моем тестовом сервере
- выполнил вставку в операторы
Это бэкдор-решение, но поскольку у меня были проблемы, это сработало для меня.
Так как я создал пустые таблицы с помощью SCRIPT TABLE AS / CREATE
, чтобы перенести все ключи и индексы, я не мог использовать SELECT INTO
. SELECT INTO
работает только в том случае, если таблицы не существуют в месте назначения, но не копируют ключи и индексы, поэтому вам нужно сделать это вручную. Недостатком использования инструкции INSERT INTO
является то, что вы должны вручную указать все имена столбцов, а также могут возникнуть некоторые проблемы, если сбой некоторых внешних ключей.
Спасибо всем, есть несколько отличных решений, но я решил принять marc_s anwser.
Ответ 9
Для копирования данных из источника в пункт назначения:
use <DestinationDatabase>
select * into <DestinationTable> from <SourceDataBase>.dbo.<SourceTable>
Ответ 10
Это несколько решение, но это сработало для меня. Я надеюсь, что он работает и для этой проблемы для других:
Вы можете запустить SQL-запрос select в таблице, которую вы хотите экспортировать, и сохранить результат как .xls в вашем диске.
Теперь создайте таблицу, которую вы хотите добавить, со всеми столбцами и индексами. Это можно легко сделать, щелкнув правой кнопкой мыши по фактической таблице и выбрав "Создать для
Теперь вы можете щелкнуть правой кнопкой мыши по БД, где вы хотите добавить свою таблицу, и выбрать "Задачи" > "Импорт".
Откроется мастер импорта экспорта и выберите следующий. Выберите Microsoft Excel в качестве источника данных ввода, а затем просмотрите и выберите файл .xls, который вы сохранили ранее.
Теперь выберите целевой сервер, а также таблицу назначения, которую мы создали уже.
Примечание. Если есть какое-либо поле для идентификации, в таблице назначения вы можете удалить свойство идентификации, так как эти данные также будут вставлены. Поэтому, если у вас есть это свойство Identity только тогда, это приведет к ошибке процесса импорта.
Теперь нажмите "Далее" и нажмите "Готово", и он покажет вам, сколько записей импортируется и возвращает успех, если ошибок не возникает.
Ответ 11
Еще один вариант, если у вас есть это: С#.net. В частности, пространство имен Microsoft.SqlServer.Management.Smo.
Я использую код, похожий на следующий в компоненте Script одного из моих пакетов SSIS.
var tableToTransfer = "someTable";
var transferringTableSchema = "dbo";
var srvSource = new Server("sourceServer");
var dbSource = srvSource.Databases["sourceDB"];
var srvDestination = new Server("destinationServer");
var dbDestination = srvDestination.Databases["destinationDB"];
var xfr =
new Transfer(dbSource) {
DestinationServer = srvDestination.Name,
DestinationDatabase = dbDestination.Name,
CopyAllObjects = false,
DestinationLoginSecure = true,
DropDestinationObjectsFirst = true,
CopyData = true
};
xfr.Options.ContinueScriptingOnError = false;
xfr.Options.WithDependencies = false;
xfr.ObjectList.Add(dbSource.Tables[tableToTransfer,transferringTableSchema]);
xfr.TransferData();
Я думаю, что мне пришлось явно искать и добавлять библиотеку Microsoft.SqlServer.Smo к ссылкам. Но вне этого, это было для меня.
Обновление: пространство имен и библиотеки были более сложными, чем я помнил.
Для библиотек добавьте ссылки на:
- Microsoft.SqlServer.Smo.dll
- Microsoft.SqlServer.SmoExtended.dll
- Microsoft.SqlServer.ConnectionInfo.dll
- Microsoft.SqlServer.Management.Sdk.Sfc.dll
Для пространств имен добавьте:
- Microsoft.SqlServer.Management.Common
- Microsoft.SqlServer.Management.Smo