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

时间:2016-04-25 18:59:11

标签: c# sql list

假设我们在两个数据库中有两个表,它们位于不同的数据库服务器中。

情况就是这个
第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)

但是当源表和目标表分布在两个不同的数据库服务器中时,我遇到了问题。

我如何实现上述步骤?

2 个答案:

答案 0 :(得分:1)

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

我不知道你的模型所以我把它作为一个实验留给你如何使用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();
    }
}

答案 1 :(得分:0)

  1. server1创建链接服务器和

    EXEC master.dbo.sp_addlinkedserver @server = N'server2',@ srvproduct = N'SQL Server'

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

  2. server1执行您的查询

    使用dbName1

    INSERT INTO server2.dbName2.dbo.table2(id,name,adresse)
    SELECT * FROM dbo.table1 t1
    在t1.id = t2.id上左加入server2.dbName2.dbo.table2 t2 其中t2.id为空