Мне нужно что-то вроде:
insert into server2.database1.table1 select * from server1.database1.table1
обе таблицы одинаковы.
Как я могу Скопировать данные между двумя экземплярами сервера?
Мне нужно что-то вроде:
insert into server2.database1.table1 select * from server1.database1.table1
обе таблицы одинаковы.
Как я могу Скопировать данные между двумя экземплярами сервера?
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. Достижение такого совместного размещения может использовать различные методы, я предлагаю сократить файлы базы данных, прежде чем продолжить:
В любом случае версия SQL Server может быть барьером. Если server1 имеет более низкую версию SQL, то, скорее всего, будут выполняться как методы резервного копирования, так и отсоединения/подключения. Это можно обойти, перемещая базу данных server1 на server2, что может быть или не быть более подходящим.
Другие методы
Может быть подходящим, не-SQL/TSQL-метод, не позволяющий использовать благоприятные экологические факторы для ранее упомянутых методов. И если у вас есть правильный доступ (OLE DB Drivers и т.д.), Этот метод также может работать между различными типами RDBMS (то есть с не-SQL Server) и источниками данных (такими как XML, flatfiles, Excel Spreadsheets...)
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).
Обновление - изменение таблицы адресатов
Если вам нужно обновить таблицу назначения, я рекомендую вам:
Такой целый процесс может быть расширен с помощью скользящего окна (изменяется с момента последнего проверки), только принимая недавно измененные строки в источнике, применяя к месту назначения, это усложняет процесс, поэтому вы должны, по крайней мере, выполнить более простой первый, После завершения версии скользящего окна вы можете периодически запускать полное обновление, чтобы убедиться, что в скользящем окне нет ошибок.
Для копирования данных между двумя разными серверами у вас есть несколько вариантов:
Аналогично Todd С# SqlBulkCopy
Как правило, это проще, чем создание связанных серверов.
Создайте unit test и запустите ниже, если у вас есть триггеры, будьте осторожны, и вам понадобятся разрешения ALTER.
[Test]
public void BulkCopy()
{
var fromConnectionString = @"fromConnectionString";
var destinationConnectionString = @"destConnectionString2";
using (var testConnection = new SqlConnection(fromConnectionString))
{
testConnection.Open();
var command = new SqlCommand("select * from MyTable;", testConnection);
using (var reader = command.ExecuteReader())
{
using (var destinationConnection = new SqlConnection(destinationConnectionString))
{
using (var bc = new SqlBulkCopy(destinationConnection))
{
destinationConnection.Open();
bc.DestinationTableName = "dbo.MyTable";
bc.WriteToServer(reader);
}
}
}
}
}
}
Лучший способ сделать это - создать "связанный сервер". И затем вы можете использовать инструкцию ниже в свой оператор insert, чтобы определить вашу таблицу
[linkedserver].databasename.dbo.tablename
На сервере A добавить связанный сервер (B)
http://msdn.microsoft.com/en-us/library/ms188279.aspx
Затем вы можете передавать данные между ними.
Экспортировать данные таблицы с одного SQL Server на другой
НТН
Сначала вам нужно добавить сервер Например. Сервер 1 и Сервер 2
sp_addlinkedserver 'Server-2'
затем скопируйте свои данные с этого сервера на ваш сервер, используя следующий запрос
В Server-1 Write
select * INTO Employee_Master_bkp
FROM [Server-2].[DB_Live].[dbo].[Employee_Master]