最近遇到一个需求,需要把Oracle中一部分表的数据迁移到SQL Server数据库中。但是这些表的结构是有些差异的。
方法一,使用SQL Develper的数据导出工具,导出SQL insert语句,然后再手动修改其中的一些细节,最后在放到SQL Server中执行。因为前后的表结构是有差异的,我需要一条一条语句的去删掉一些字段,然后再删掉一些值,几条或者几十条数据还行,这40万条数据,太多了,这个方法行不通。
方法二,使用C#代码。我用C#写了一个Data Migration的控制台小程序,把Oracle表中的所有数据读取到DataTable中,然后取出需要的字段,拼接成SQL语句,在使用C#代码写入到SQL Server数据库中。虽然这个方法完全自动化,可是遇到了性能了问题,因为Oracle与SQL Server数据库都不是本地的,都是在数据库服务器上的,取数据的时候还可以,但是插入数据的时候,很慢。以前用一个SqlConnection,接收到一条SQL语句的时候,new一个SqlCommand去执行,总共new了40万个SqlCommand.考虑到性能,就想用一个SqlCommand,设置一个循环,循环40万次,每次更改其Text字符串,但是我发现并没有太大的性能上的改善。然后想把40万条insert语句放入到一个字符串中,一下子到数据库中去执行。但是这个办法,执行了command.ExecuteNonquery之后,因为数据库非常大,会长时间没有反应,而且程序会抛出timeout
exception的异常。
方法三,既然不能用程序插入,那么我就用C#程序把数据导出,拼接成sql语句放入到文本文件中。因为是自己拼接的,可控性强,就不用像方法一中那样去更改了。然后打开SQL Server Management Studio,连接到远程数据库,执行这个SQL脚本文件就可以了,这样比C#代码插入快多了。
关于Oracle与SQL Server中数据迁移的办法