首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用insert语句将数百万不同RDBMS的数据插入到Server数据库中?

如何使用insert语句将数百万不同RDBMS的数据插入到Server数据库中?
EN

Stack Overflow用户
提问于 2017-12-14 13:12:55
回答 6查看 1.3K关注 0票数 11

到目前为止,我的Server中有两个数据库,每个数据库包含一个表。

我有两个数据库如下:

1) Db1 (MySQL)

2) Db2 (甲骨文)

现在,我要做的是用来自db1的Db1的数据填充Server的数据库表,如下所示:

代码语言:javascript
复制
Insert into Table1 select * from Table1

从Table1(Mysql Db1)选择*-来自Mysql数据库的数据 插入到Table1(Sql server Db1) -从Mysql数据库插入考虑相同模式的数据

我不想使用don批量复制,因为我不想逐块插入数据。我希望将所有数据插入到1 go中,因为我的操作不限于在数据库中插入记录。因此,用户必须坐着等待一个长的,比如第一个数以百万计的数据,在数据库中逐块插入,然后再等待我的进一步操作,这也是长时间运行的操作。

因此,如果我加快了这个过程,那么我的第二个操作也可以加快,因为所有记录都在我的一个本地sql服务器实例中。

这可以在C#应用程序中实现吗?

更新:我研究了链接服务器,因为@GorDon 建议我可以使用链接服务器来实现这个场景,但根据我的研究,我似乎无法通过代码创建链接服务器。

我想在ado.net的帮助下这样做。

这正是我想要做的:

假设我有两个不同的客户端RDBMS,其中有两个数据库和客户端中的一些表。

所以数据库是这样的:

代码语言:javascript
复制
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

现在,我想比较源( Server)和目标数据库(MySQL或Oracle)之间的数量列。

我将用来连接这两个不同的RDBMS数据库表来比较数量列。

在C#中,我可以做的是像在我的datatable (内存中)中逐块获取记录,然后借助代码比较这些记录,但是这需要花费大量的时间来考虑数百万条记录。

所以我想做点更好的事。

因此,我想在两个数据库中的本地SQL server实例中提取这两个RDBMS记录,然后创建连接查询,基于Id连接这两个表,然后利用DBMS的处理能力,有效地比较这数百万条记录。

这样的查询有效地比较了数百万条记录:

代码语言:javascript
复制
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

当我的本地服务器实例中有两个不同的关系数据库数据时,上面的查询工作: SqlServerDb和MysqlDb,这将从数量不匹配的记录下面获取:

因此,我试图将这些记录从源( server )获取到MySQL,其数量列值不匹配。

预期输出:

代码语言:javascript
复制
Id      Amount
1       1000
2       2000
3       3000

那么有什么方法可以达到这种情况呢?

EN

回答 6

Stack Overflow用户

发布于 2017-12-16 19:49:30

SELECT端,使用SELECT ... INTO OUTFILE ...创建一个.csv文件(制表符分隔)。

INSERT方面,使用LOAD DATA INFILE ... (或任何目标机器语法)。

同时这样做可能比分块更容易编写代码,而且可能(或不)运行得更快。

票数 3
EN

Stack Overflow用户

发布于 2017-12-21 04:29:50

SqlBulkCopy可以接受DataTableSystem.Data.IDataReader作为输入。

使用查询读取源DB,在源数据库或Oracle上设置ADO.Net DataReader,并将读取器传递给SqlBulkCopyWriteToServer()方法。

这可以不受限制地复制几乎任意数量的行。我已经使用数据读取器方法复制了数亿行。

票数 2
EN

Stack Overflow用户

发布于 2017-12-18 13:29:55

在远程数据库中添加更改的日期如何?

那么,您可以获得自上次同步以来更改的所有行,并将它们进行比较?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47814248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档