从一个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();
}
}
-
在创建链接服务器和
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 = '########'
-
执行您的查询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为空
嘿斯科特,非常感谢你的回答我的问题。我试着像你建议的那样,通过执行命令(createTableCommand.ExecuteNonQuery();)我得到了一个SqlExeption错误:错误说:在SqlTestConnection.exe中发生未处理的异常类型'System.Exception' – gawgaw
使用调试器[copy例外详情](https://blogs.msdn.microsoft.com/saraford/2008/08/07/did-you-know-you-can-copy-the-exception-details-with-one-click-from - 例外助理-276 /)作为你的问题的编辑 –