2016-04-25 3 views
0

Предположим, что у нас есть две таблицы в двух базах данных, которые расположены на разных серверах баз данных.Скопировать данные из одной таблицы SQL и вставить ее в другую таблицу

Ситуация такая:
Шаг 1: Выберите данные из первой таблицы.
Шаг 2: Итерация по результатам первого этапа
Шаг 2.1: Для каждой строки, который не присутствует в таблице socond
Шаг 2.2: Если результат шаге 2.1 верно , вставьте строку во вторую таблицу.

В случае таблицы находятся в одном сервере следующий SQL-запрос работает отлично:

INSERT INTO server.table2(id, name, adresse) 
SELECT * FROM server.table1 WHERE table2.id NOT IN (SELECT id FROM server.table2) 

Но у меня есть проблема, когда исходная таблица и таблица назначения распределяются в двух разных серверах баз данных.

Как я могу реализовать описанные выше шаги?

ответ

1

Лучший способ, как правило, справиться с этим - это массовая копия во временную таблицу данных, тогда вы можете выполнить свой обычный запрос, как и вы.

Я не знаю ваших моделей, поэтому я оставляю это как эксперимент для вас, как это сделать со списком, но если вы можете открыть сразу два соединения, вы можете легко сделать это так, используя SqlBulkCopy для передачи между двух серверов.

using (var sourceConnection = new SqlConnection(sourceConnectionString)) 
using (var destinationConnection = new SqlConnection(destinationConnectionString)) 
{ 
    sourceConnection.Open(); 
    destinationConnection.Open(); 

    var createTableQuery = "create table #t (id uniqueidentifier, name nvarchar(100), adresse(nvarchar(100))"; 
    using (var createTableCommand = new SqlCommand(createTableQuery, destinationConnection)) 
    { 
     createTableCommand.ExecuteNonQuery(); 
    } 

    using (var selectCommand = new SqlCommand("SELECT id, name, adresse FROM table1")) 
    using (var selectReader = selectCommand.ExecuteReader()) 
    using (var destBulkInsert = new SqlBulkCopy(destinationConnection)) 
    { 
     destBulkInsert.DestinationTableName = "#t"; 
     destBulkInsert.WriteToServer(selectReader); 
    } 

    var mergeQuery = "INSERT INTO table2(id, name, adresse) SELECT * FROM #t WHERE #t.id NOT IN(SELECT id FROM table2)"; 
    using (var mergeCommand = new SqlCommand(mergeQuery, destinationConnection)) 
    { 
     mergeCommand.ExecuteNonQuery(); 
    } 
} 
+0

Эй Скотт, Большое спасибо за ответ на мой вопрос. Я попробовал, как и вы, но я получил ошибку SqlExeption, выполнив команду (createTableCommand.ExecuteNonQuery();) ошибка говорит: в SqlTestConnection.exe произошло необработанное исключение типа «System.Exception». – gawgaw

+0

Используйте отладчик, [копировать сведения об исключении] (https://blogs.msdn.microsoft.com/saraford/2008/08/07/did-you-know-you-can-copy-the-exception-details-with-one-click-from -the-exception-assistant-276 /) в качестве редактирования вашего вопроса –

0
  1. На создают связанный сервер и

    EXEC master.dbo.sp_addlinkedserver @server = N'server2' , @ srvproduct = N'SQL сервер»

    EXEC master.dbo .sp_addlinkedsrvlogin @ rmtsrvname = N'server2' , @ useself = N'False '@ locallogin = NULL, @ rmtuser = N'USER_NAME', @ rmtpassword = '########'

  2. Execute ваш запрос fr ом в

    использование dbName1
    пойти

    INSERT INTO server2.dbName2.dbo.table2 (идентификатор, имя, ADRESSE)
    SELECT * FROM t1 dbo.table1
    слева присоединиться server2.dbName2.dbo .table2 t2 на t1.id = t2.id
    где t2.id является нулевым

Смежные вопросы