从一个SQL表复制数据并将其插入到另一个表中

问题描述:

假设我们在位于不同数据库服务器的两个数据库中有两个表。从一个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) 

但我有一个问题,当源表和目标表分布在两个不同的数据库服务器。

如何才能实现上述步骤?

通常处理此问题的最佳方法是将数据批量复制到临时表中,然后您可以像执行常规查询那样执行数据。

我不知道你的模型,所以我把它作为一个实验留在如何用List实现,但如果你可以一次打开两个连接,你可以很容易地使用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

嘿斯科特,非常感谢你的回答我的问题。我试着像你建议的那样,通过执行命令(createTableCommand.ExecuteNonQuery();)我得到了一个SqlExeption错误:错误说:在SqlTestConnection.exe中发生未处理的异常类型'System.Exception' – gawgaw

+0

使用调试器[copy例外详情](https://blogs.msdn.microsoft.com/saraford/2008/08/07/did-you-know-you-can-copy-the-exception-details-with-one-click-from - 例外助理-276 /)作为你的问题的编辑 –

  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. 执行您的查询fr OM 作为

    使用dbName1

    INSERT INTO server2.dbName2.dbo.table2(ID,姓名,住址)
    SELECT * FROM dbo.table1 T1
    左连接server2.dbName2.dbo在t1.id = t2.id
    .table2 T 2,其中t2.id为空