C# 如何使用insert语句将不同RDBMS的数百万数据插入SQL Server数据库?
我的SQL Server中有两个数据库,到目前为止,每个数据库都包含一个表 我有两个数据库,如下所示:C# 如何使用insert语句将不同RDBMS的数百万数据插入SQL Server数据库?,c#,mysql,database,ado.net,C#,Mysql,Database,Ado.net,我的SQL Server中有两个数据库,到目前为止,每个数据库都包含一个表 我有两个数据库,如下所示: Insert into Table1 select * from Table1 1) Db1(MySQL) 2) Db2(Oracle) 现在我要做的是用MySQL中的db1数据填充我的SQL Server db1数据库表,如下所示: Insert into Table1 select * from Table1 从表1(Mysql Db1)中选择* 插入到表1(Sql server Db
Insert into Table1 select * from Table1
1) Db1(MySQL)
2) Db2(Oracle)
现在我要做的是用MySQL中的db1数据填充我的SQL Server db1数据库表,如下所示:
Insert into Table1 select * from Table1
从表1(Mysql Db1)中选择*
插入到表1(Sql server Db1)-插入来自Mysql的数据
考虑相同模式的数据库
我不想使用sqlbulk copy,因为我不想逐块插入数据。考虑到数以百万计的数据,我想在一次过中插入所有数据,因为我的操作不限于在数据库中插入记录。所以用户必须坐着等待很长时间,就像在数据库中逐块插入数百万数据一样,然后再次等待我的进一步操作,这也是一个长时间运行的操作
因此,如果我加快了这个过程,那么考虑到所有记录都在我的1个本地sql server实例中,我也可以加快我的第二个操作
这在C#应用程序中是否可能实现
更新:我研究了链接服务器,因为@GorDon Linoff建议我可以使用链接服务器来实现此场景,但根据我的研究,我似乎无法通过代码创建链接服务器
我想在ado.net的帮助下完成这项工作
这正是我想要做的:
假设我有2个不同的客户机RDBMS,其中包含2个数据库和客户机内部的一些表
所以数据库是这样的:
Sql Server :
Db1
Order
Id Amount
1 100
2 200
3 300
4 400
Mysql or Oracle :
Db1:
Order
Id Amount
1 1000
2 2000
3 3000
4 400
现在我想比较源数据库(SQLServer)和目标数据库(MySQL或Oracle)中的金额列
我将用于连接这两个不同的RDBMS数据库表以比较金额列
在C#中,我可以做的是在我的数据表(内存中)中逐块获取记录,然后在代码的帮助下比较这些记录,但考虑到数百万条记录,这将花费大量时间
所以我想做一些比这更好的事情
因此,我认为我在两个数据库中的本地SQL server实例中拿出了这两个RDBMS记录,然后基于Id创建连接这两个表的连接查询,然后利用DBMS处理能力,可以有效地比较这数百万条记录
这样的查询可以有效地比较数百万条记录:
select SqlServer.Id,Mysql.Id,SqlServer.Amount,Mysql.Amount from SqlServerDb.dbo.Order as SqlServer
Left join MysqlDb.dbo.Order as Mysql on SqlServer.Id=Mysql.Id
where SqlServer.Amount != Mysql.Amount
当我的本地服务器实例中有这两个不同的RDBMS数据和数据库时,上面的查询工作:SqlServerDb和MysqlDb,这将获取以下数量不匹配的记录:
因此,我试图从源代码(SQLServerDB)中获取那些Amount列值不匹配的记录到MySQL
预期输出:
Id Amount
1 1000
2 2000
3 3000
那么有什么方法可以实现这个场景呢?在
选择
端,使用选择创建一个.csv
文件(以制表符分隔)。。。输入输出文件…
在插入
侧,使用加载数据填充…
(或任何目标机器语法)
一次完成这一切可能比分块更容易编码,而且可能(也可能不)运行得更快。在远程数据库中添加更改的日期怎么样
然后,您可以获取自上次同步以来已更改的所有行,并对其进行比较?首先,不要使用链接服务器。这很诱人,但它带来的麻烦比摆在桌面上的要多。Like updates和insert将把所有目标数据库提取到源数据库,并执行insert/update,将所有数据发布回目标数据库 据我所知,您正试图将更改后的数据复制到目标系统中以获取某些信息 我建议在源表上使用timestamp列。当源表时间戳列发生任何更改时,sql server将更新该列 在目标上,获取最大ID和最大时间戳。最多两个查询 在source上,
source.ID=target.MaxTimeTamp
为true的行是上次同步(需要更新)后更改的行。source.ID>target.MaxID
为true的行是上次同步后插入的行
现在,您不必比较两个世界,只需获得所有更新和插入。您需要使用ODBC和适当的驱动程序创建链接服务器连接,然后可以使用openquery执行查询 看看openquery:
SqlBulkCopy
可以接受DataTable
或System.Data.IDataReader
作为其输入
使用查询读取源数据库,在源MySQL或Oracle数据库上设置ADO.NetDataReader
,并将读取器传递给SqlBulkCopy
的WriteToServer()
方法
这可以无限制地复制几乎任意数量的行。我已经使用数据读取器方法复制了数亿行。是的,SQL Server在处理集合时非常高效,所以让我们继续使用它 简言之,我所宣传的是
考虑到您正在谈论的是数百万行,另一件可以加快速度的事情是在插入到临时表之前删除临时表上的索引,并在插入之后和执行任何选择之前重新创建这些索引。使用链接服务器。@GordonLinoff使用链接服务器我的mentio可以做到这一点吗