假设我们在两个数据库中有两个表,它们位于不同的数据库服务器中。
情况就是这个:
第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)
但是当源表和目标表分布在两个不同的数据库服务器中时,我遇到了问题。
我如何实现上述步骤?
答案 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)
在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 ='######## “
从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为空