Ответ 1
SQL-Linked Server
Если оба сервера являются SQL Server, вы можете настроить Связанные серверы - я бы предложил использовать учетную запись SQL для обеспечения безопасности.
Затем вы можете просто выполнить
insert into server2.database1.dbo.table1
select * from server1.database1.dbo.table1 where col1 = 'X'
Если вы запустите запрос в студии управления SQL, подключенной к серверу 1, а текущая база данных установлена в базу данных1, вам не понадобится префикс
server1.database1.dbo.
Кроме того, связанный сервер будет настроен на сервере1, чтобы подключиться к серверу2 (а не наоборот).
Если у вас есть правильные драйверы OLE DB, этот метод также может работать между различными типами РСУБД (то есть с не-SQL Server).
Открыть запрос
Примечание. Остерегайтесь не полагаться на связанные серверы слишком сильно, особенно для фильтрации, и для присоединения к серверам, поскольку они требуют полного считывания данных в исходную СУБД до того, как будут применены какие-либо условия. Многие связанные осложнения могут возникать из связанных серверов, поэтому читайте перед тем, как приступить к работе, так как даже различия в версии могут вызвать головные боли.
Я рекомендую вам использовать команду OPENQUERY для SQL-серверов, чтобы обойти эти ограничения. Вот пример, но вы должны найти помощь, специфичную для ваших потребностей, путем дальнейшего исследования:
insert into server2.database1.dbo.table1
select * from OPENQUERY(server1, 'select * from database1.dbo.table1 where col1 = ''X''');
Вышеприведенный код более эффективен, фильтруя данные на исходном сервере (и используя доступные индексы), прежде чем накачать данные, сохраняя пропускную способность/время/ресурсы как исходного, так и целевого серверов.
(Также обратите внимание на двойную кавычку '', - это escape-последовательность для создания одиночной кавычки.)
SQL - временно на том же сервере
Включить (обратите внимание на подчеркивание):
insert into server2_database1.dbo.table1
select * from database1.dbo.table1
Все еще в домене запросов SQL. Если вы можете временно переместить базу данных на server2 на server1, вам не понадобится связанный сервер. Переименование базы данных, по-видимому, потребуется при совместном размещении на сервере1. Достижение такого совместного размещения может использовать различные методы, я предлагаю сократить файлы базы данных, прежде чем продолжить:
- Резервное копирование/восстановление. Резервное копирование на сервере2, восстановление на сервере1 (с другим именем) - выполнить вставку, как описано выше, но без префиксов server1 или server2. Затем обратное - резервное копирование на сервере1, восстановление на сервере2/
- Отсоединить/Прикрепить - переименовать базу данных, отсоединить на сервере2 (сжать), скопировать файлы на сервер 1 (распаковать), прикрепить на сервере1, выполнить вставку. Затем измените...
В любом случае версия SQL Server может быть барьером. Если server1 имеет более низкую версию SQL, то, скорее всего, будут выполняться как методы резервного копирования, так и отсоединения/подключения. Это можно обойти, перемещая базу данных server1 на server2, что может быть или не быть более подходящим.
Другие методы
Может быть подходящим, не-SQL/TSQL-метод, не позволяющий использовать благоприятные экологические факторы для ранее упомянутых методов. И если у вас есть правильный доступ (OLE DB Drivers и т.д.), Этот метод также может работать между различными типами RDBMS (то есть с не-SQL Server) и источниками данных (такими как XML, flatfiles, Excel Spreadsheets...)
- SSIS Явно с помощью Business Development Management Studio - прямой datapump или с использованием ограниченного промежуточного файла.
- SSIS Неявно через SQL Management Studio, щелкнув правой кнопкой мыши базу данных1 на сервере1 > Задачи > Экспорт, а затем завершите работу мастера. Может работать непосредственно с сервером2 или с использованием файлового посредника.
- .Net-программирование с SqlBulkInsert (я считаю, что в качестве источника данных SSIS используется такой объект), я могу подробнее рассказать об этом, если он вас интересует.
Eg. SQLBulkInsert (код psedo-С#)
SqlConnection c = new SqlConnection("connectionStringForServer1Database1Here");
SqlConnection c2 = new SqlConnection("connectionStringForServer2Database1Here");
c.Open();
SqlCommand cm = new SqlCommand(c);
cm.CommandText = "select * from table1;";
using (SqlDataReader reader = cm.ExecuteReader())
{
using (SqlBulkInsert bc = new SqlBulkInsert(c))
{
c2.Open();
bc.DestinationTable = "table1";
bc.WriteToServer(reader);
}
}
Довольно круто, да? Если значение скорости/эффективности является проблемой, то лучше всего использовать подходы SqlBulkInsert (такие как SSIS).
Обновление - изменение таблицы адресатов
Если вам нужно обновить таблицу назначения, я рекомендую вам:
- Напишите в промежуточную таблицу в базе данных назначения (временную таблицу или соответствующую таблицу, которую вы усекаете до и после процесса), последнее предпочтительнее. Первый может быть вашим единственным выбором, если у вас нет прав CREATE TABLE. Вы можете выполнить передачу, используя любую из указанных выше опций.
- Запустите команду MERGE INTO в соответствии с вашими требованиями из промежуточной таблицы в таблицу назначения. Это может вставлять, обновлять и удалять по мере необходимости очень эффективно.
Такой целый процесс может быть расширен с помощью скользящего окна (изменяется с момента последнего проверки), только принимая недавно измененные строки в источнике, применяя к месту назначения, это усложняет процесс, поэтому вы должны, по крайней мере, выполнить более простой первый, После завершения версии скользящего окна вы можете периодически запускать полное обновление, чтобы убедиться, что в скользящем окне нет ошибок.