数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

在SQLServer成批导入数据


发布日期:2020年12月05日
 
在SQLServer成批导入数据

在软件项目实施的时候数据导入一直是项目人员比较头疼的问题其实在SQL Server中集成了很多成批导入数据的方法有些项目实施顾问头疼的问题在我们数据库管理员眼中是小菜一碟现在的重点就是如何让用户了解这些方法让数据导入变得轻松一些

第一种方法使用Select Into语句

若企业数据库都采用的是SQL Server数据库的话则可以利用Select Into语句来实现数据的导入Select Into语句他的作用就是把数据从另外一个数据库中查询出来然后加入到某个用户指定的表中

在使用这条语句的时候需要注意几个方面的内容

一是需要在目的数据库中先建立相关的表如想把进销存系统数据库(SQLServer)中的产品信息表(Product)导入到ERP系统中的产品信息表(M_Product)中则前期是在ERP系统的数据库中已经建立了这张产品信息表

二是这种方法只复制表中的数据而不复制表中的索引如在进销存系统数据中的产品信息表中在产品编号产品种类等字段上建立了索引则利用Select Into语句把数据复制到ERP系统的表中的时候只是复制了数据内容的本身而不会复制索引等信息

三是这条语句使用具有局限性一般情况下这只能够在SQL Server数据库中采用不过对于SQL Server不同版本的数据库或者还都是兼容的若需要导入的对象数据库不是SQL Server的则需要采用其他的方法

四是采用这条语句的话在目的表中必须不存在数据否则的话目的表中的数据会被清除也就是说这个语句不支持表与表数据的合并在SQL Server中有一条类似的语句可以实现这个功能这条语句就是Insert Into他的作用就是把另外一张表中的数据插入到当前表中若用户想要的时表与表数据的合并则可以采用这条语句两者不能够混淆使用否则的话很容易导致数据的丢失

五是以上两条语句都支持兼容的不同类型的数据类型如在原标中某个字段的数据类型是整数型但是在目的表中这个字段的数据类型则是浮点型只要这个两个数据类型本来就兼容的则在导入的时候数据库是允许的

第二种方法利用Excel等中间工具进行控制

虽然第一种方法操作起来比较简单但是其也有一些缺点如他只支持同一种类型的数据库;不能够对数据进行过多的干预等等一般情况下若用户原数据准确度比较高不需要过多的修改就可以直接拿来用的话则笔者就已采用第一种方式

但是若在原数据库中数据的准确度不是很高又或者有很多数据是报废的总之需要对原数据库的数据进行整理才能够使用的情况笔者不建议先导入进去再进行更改笔者在遇到这种情况时喜欢利用Excle作为中间工具也就是说先把数据中原数据库中导到Excle中有些数据库如Oracle数据库他不支持Excle格式但是我们可以把它导为CSV格式的文件这种文件Excle也可以打得开

然后再在Excle中对记录进行修改由于Excle是一个很强的表格处理软件所以其数据修改要比在数据库中直接修改来得方便来得简单如可以利用按时间排序等功能把一些长久不用的记录清楚掉也可以利用替换等功能把一些不规范的字符更改掉这些原来在数据库中比较复杂的任务在Excle等工具中都可以轻松的完成

等到表中的内容修改无误后数据库管理员就可以把Excle表格中的文件直接导入到SQL Server数据库中由于SQL Server与Excel是同一个父母生的所以他们之间的兼容性很好在Sql Server中提供了直接从Excel文件中导入数据的工具

虽然这要借助中间工具导入数据但是因为其处理起来方便直观所以笔者在大部分时候都是采用这种方式

第三种方式使用数据转换服务导入数据

数据转换服务是SQL Server数据库中提供的一个非常强大的工具在SQLServer中数据转换功能有一个图形用户接口用户可以在图形界面中导入数据并对数据进行相应的编辑

另外数据转换服务还支持COM组件的编程接口这也就是说在前台应用程序开发的时候可以直接调用数据转换服务让用户通过前台应用系统而不用在后台数据库系统进行任何的操作就可以把数据导入数据库系统中去在前台对数据库系统进行导入有一个明显的好处就可以预先对数据的合法性进行检查如可以利用VB等脚本语言对数据进行检验净化和一定的转换以符合目的数据库的需要

如在员工信息表中的婚姻状况字段在Oracle数据库系统中可能是用或者来表示婚姻状况表示未婚表示已婚而在SQL Server数据库中则利用Y或者N来表示婚姻状况Y表示已婚N表示未婚在导入数据的时候若直接把Oracle数据库表中的数据导入到SQL Server数据库中因为婚姻状况这个字段存储的内容类型不同所以不能够直接导遇到这种情况的话则就可以在导入数据之前先利用脚本语言对数据类型进行验证若不符合要求的则可以通过脚本语言对数据进行一定的转换转换为N转换为Y等等

所以有时候程序员在开发前台应用程序的时候若要开发数据导入功能的话我们都是建议采用这个数据转换服务不但有现成的接口而且还可以对数据进行验证与一定程度的转换另外数据转换服务的数据导入效率非常的高即使通过前台程序调用其性能也比其他方法在同等条件下要高一个档次而且随着数据量的增加数据转换服务的优势会越来越明显

不过在前台应用程序调用数据转换服务的时候需要注意数据转换服务提供的COM接口比较复杂所以前台程序调用数据转换服务的代码也比较复杂若再加上一些脚本语言的话可能处理起来更加的繁琐故一般只有在大型系统上才会用到这个接口若数据不多否则不需要复杂验证与转换的话利用这个接口是大刀小用得不偿失

第四种方式异构数据库之间的导入导出

虽然第二种第三种方式都可以完成异构数据库之间数据的导入导出作业不过在SQL Server中还提供了另外一种解决方案即直接在SQL Server数据库中连接到其他类型的数据库上然后采用Select Into等语句实现数据的导入作业

在SQL Server中提供了两个函数可以帮助我们实现对非SQL Server数据库的连接这两个函数分别为Opendatesource与Openrowset他们的功能基本相同只是在细节上有所差异

如Opendatesource这个函数至能够打开源数据库的表和视图而不能够对其进行过滤若用户只想把源表中的部分数据导入到SQL Server数据库的表中则不能对源表直接进行过滤过滤的动作需要在SQL Server数据库中进行而Openrowset这个函数可以在打开对方数据库的表或者视图的时候直接利用Where等条件限制语句对记录进新过滤为此在实际应用中还是Openrowset这个函数使用的频率比较高

不过由于其需要用户写复杂的参数而且又不能够提供复杂的数据验证功能所以在实际工作中用的并不是很多在一些小的应用系统中偶尔还可以见到其的蹤影在一些大的成熟的商业软件中很少采用这种方式对数据进行导入

有时候选择多了用户反而不知道如何下手笔者平时最喜欢采用的是第二种处理方式他比较直观而且可以对数据进行成批的更改与整理但是其缺陷就是效率比较低特别是Excle软件对于处理大量记录的时候速度比较慢若这种方式行不通的话则笔者比较倾向于采用数据转换的处理方式这个操作起来虽然比较复杂但是其可以提供比较复杂的验证而且可以在图形化的界面中对数据进行修改同时效率也比较高

上一篇:SQL在存储过程中使用递归

下一篇:sqlserver的BCP导入导出