在我们建立一个数据库时,并且想将分散在各处的不同类型的数据库分类汇总在这个新建的数据库中时,尤其是在进行数据检验、净化和转换时,将会面临很大的挑战。幸好SQL Server为我们提供了强大、丰富的数据导入导出功能,并且在导入导出的同时可以对数据进行灵活的处理。

在SQL Server中主要有三种方式导入导出数据:使用Transact-SQL对数据进行处理;调用命令行工具BCP处理数据;使用数据转换服务(DTS)对数据进行处理。这三种方法各有其特点,下面就它们的主要特点进行比较。

一、使用方式的比较

1. 使用Transact-SQL进行数据导入导出

我们很容易看出,Transact-SQL方法就是通过SQL语句方式将相同或不同类型的数据库中的数据互相导入导出或者汇集在一处的方法。如果是在不同的SQL Server数据库之间进行数据导入导出,那将是非常容易做到的。一般可使用SELECT INTO FROM和INSERT INTO。使用 SELECT INTO FROM时INTO后跟的表必须存在,也就是说它的功能是在导数据之前先建立一个空表,然后再将源表中的数据导入到新建的空表中,这就相当于表的复制(并不会复制表的索引等信息)。而INSERT INTO的功能是将源数据插入到已经存在的表中,可以使用它进行数据合并,如果要更新已经存在的记录,可以使用UPDATE。

SELECT * INTO table2 FROM table1

--table1和table2的表结构相同

INSERT INTO table2 SELECT * FROM table3

--table2和table3的表结构相同

当在异构数据库之间的进行数据导入导出时,情况会变得复杂得多。首先要解决的是如何打开非SQL Server数据库的问题。

在SQL Server中提供了两个函数可以根据各种类型数据库的OLE DB Provider打开并操作这些数据库,这两个函数是OPENDATASOURCE和OPENROWSET。它们的功能基本上相同,不同之处主要有两点。

(1) 调用方式不同。

OPENDATASOURCE的参数有两个,分别是OLE DB Provider和连接字符串。使用OPENDATASOURCE只相当于引用数据库或者是服务(对于SQL Server、Oracle等数据库来说)。要想引用其中的数据表或视图,必须在OPENDATASOURCE(...)后进行引用。

在SQL Server中通过OPENDATASOURCE查询Access数据库abc.mdb中的table1表

SELECT * FROM OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0',

'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=abc.mdb;Persist Security

Info=False')...

table1

OPENROWSET相当于一个记录集,可以将直接当成一个表或视图使用。

在SQL Server中通过OPENROWSETE查询Access数据库abc.mdb中的table1表

SELECT * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'abc.mdb';

'admin';'','SELECT * FROM table1')

(2) 灵活度不同。

OPENDATASOURCE只能打开相应数据库中的表或视图,如果需要过滤的话,只能在SQL Server中进行处理。而OPENROWSET可以在打开数据库的同时对其进行过滤,如上面的例子,在OPENROWSET中可以使用SELECT * FROM table1对abc.mdb中的数据表进行查询,而OPENDATASOURCE只能引用table1,而无法查询table1。因此,OPENROWSET比较OPENDATASOURCE更加灵活。

2. 使用命令行BCP导入导出数据

很多大型的系统不仅仅提供了友好的图形用户接口,同时也提供了命令行方式对系统进行控制。在SQL Server中除了可以使用SQL语句对数据进行操作外,还可以使用一个命令行工具BCP对数据进行同样的操作。BCP是基于DB-Library 客户端库的工具。它的功能十分强大,BCP能够以并行方式将数据从多个客户端大容量复制到单个表中,从而大大提高了装载效率。但在执行并行操作时要注意的是只有使用基于 ODBC 或 SQL OLE DB 的 API 的应用程序才可以执行将数据并行装载到单个表中的操作。

BCP可以将SQL Server中的数据导出到任何OLE DB所支持的数据库的,如下面的语句是将authors表导出到excel文件中。

bcp pubs.dbo.authors out c:/temp1.xls

-c -q -S"GNETDATA/GNETDATA" -U"sa" -P"password"

BCP不仅能够通过命令行执行,同时也可以通过SQL执行,这需要一个系统存储过程xp_cmdshell来实现,如上面的命令可改写为如下形式。

EXEC master..xp_cmdshell 'bcp pubs.dbo.authors out

c:/temp1.xls -c -q -S"GNETDATA/GNETDATA" -U"sa" -P"password"'

3. 使用数据转换服务(DTS)导入导出数据

DTS是SQL Server中导入导出数据的核心,它除有具有SQL和命令行工具BCP相应的功能外,还可以灵活地通过VBScript、JScript等脚本语言对数据进行检验、净化和转换。

SQL Server为DTS提供了图形用户接口,用户可以使用图形界面导入导出数据,并对数据进行相应的处理。同时,DTS还以com组件的形式提供编程接口,也就是说任何支持com组件的开发工具都可以利用com组件使用DTS所提供的功能。DTS在SQL Server中可以保存为不同的形式,可以是包的形式,也可以保存成Visual Basic源程序文件,这样只要在VB中编译便可以使用DTS com组件了。

DTS和其它数据导入导出方式最大的不同就是它可以在处理数据的过程中对每一行数据进行深度处理。以下是一段VBScript代码,这段代码在处DTS理每一条记录时执行,DTSDestination表示目标记录,DTSSource表示源记录,在处理“婚姻状况”时,将源记录中的“婚姻状况”中的0或1转换成目标记录中“已婚”或“未婚”。

Function Main()

DTSDestination("姓名") = DTSSource("姓名")

DTSDestination("年龄") = DTSSource("年龄")

If DTSDestination("婚姻状况") = 1 Then

DTSDestination("婚姻状况") = "已婚"

Else

DTSDestination("婚姻状况") = "未婚"

End If

Main = DTSTransformStat_OK

End Function

上述的三种数据导入导出方法各有其利弊,它们之间的相互比较如图1如示。

二、性能的比较

使用Transact-SQL方式。如果是SQL Server数据库之间的导入导出,速度将非常快,但是使用OPENDATASOURCE和OPENROWSET方法利用OLE DB Provider打开并操作数据库时速度会慢一些。

使用BCP命令方式。如果不需要对数据进行验证等操作的话,使用它还是非常快的,这是因为它的内部使用c接口的DB-library,所以在操作数据库时速度有很大的提升。

使用DTS方式导数据应该是最好的方式了。由于它整合了Microsoft Universal Data Access技术与Microsoft ActiveX技术,因此不仅可以灵活地处理数据,而且在数据导入导出的效率是非常高的。

总结

SQL Server提供了丰富的数据导入导出方法,这给我们提供了更多的选择,但是这又会给我们带来一个新问题:如何根据具体情况选择合适的数据导入导出方法呢?我在这里提供一些个人的建议,希望能对读者起到一定的指导作用。

如果是在SQL Server数据库之间进行数据导入导出时,并且不需要对数据进行复杂的检验,最好使用Transact-SQL方法进行处理,因为在SQL Server数据库之间进行数据操作时,SQL是非常快的。当然,如果要进行复杂的操作,如数据检验、转换等操作时,最好还是使用DTS进行处理,因为DTS不光导数据效率高,而且能够对数据进行深度控制。但是DTS的编程接口是基于com的,并且这个接口十分复杂,因此,使用程序调用DTS将变也会变得很复杂,因此, 当数据量不是很大,并且想将数据导入导出功能加入到程序中,而且没有复杂的数据处理功能时,可以使用OPENDATASOURCE或OPENROWSET进行处理。

BCP命令并不太适合通过程序来调用,如果需要使用批量的方式导数据,可以通过批处理文件调用BCP命令,这样做即不需要编写大量的程序,也无需在企业管理器中通过各种操作界面的切换来进行数据导入导出。因此,它比较适合在客户端未安企业管理器或使用SQL Server Express时对数据进行快速导入导出的场合。

转载于:https://www.cnblogs.com/deve/archive/2009/09/01/2242685.html

SQL Server数据库导入导出数据方式比较相关推荐

  1. 转载-SQL Server各种导入导出数据方式的比较

    注:本文转载自 http://blog.csdn.net/nokiaguy/article/details/4684822 当我们建立一个数据库时,并且想将分散在各处的不同类型的数据库分类汇总在这个新 ...

  2. sql server 2008 导入导出数据大全

    /*******  导出到excel EXEC master..xp_cmdshell 'bcp SettleDB.dbo.shanghu out c:\temp1.xls -c -q - S&quo ...

  3. sql server数据库导入导出bcp方法

    微软的官方文档: http://msdn.microsoft.com/zh-cn/library/ms162802.aspx 以下示例均在sql server 2005上测试过,完全ok可用的. 1. ...

  4. [转载]在SQL Server数据库之间进行数据导入导出,OPENDATASOURCE

    需要在c盘下先建立一个data.txt文件,然后在文件的第一行写上你要导出的列,不如说要导出id和name这两列,就在第一行写上 id,name 然后保存,使用下列SQL就可以了,你如果要保持原有的I ...

  5. 在SQL Server数据库之间进行数据导入导出

    来源:http://kb.cnblogs.com/page/94464/ 在SQL Server数据库之间进行数据导入导出 (1).使用SELECT INTO导出数据 在SQL Server中使用最广 ...

  6. SQL Server 2008 R2导出数据脚本和导入数据库脚本的方法(原创+转载)

    以前看到有些朋友说必须SQL Server 2008才能导出包含数据的脚本,后来仔细研究发现其实SQL Server 2008 R2也是可以的,只需在导出的时候在高级中设置一下即可. 1.首先在数据库 ...

  7. 从sqlserver中数据写入mysql_从SQL server数据库导入Mysql数据库的体验

    起原:网海拾贝  ,因任务需要,要将寄存在sqlserver数据库中的数据全部导入到mysql数据库中,在网上集合关连资料,找到两种体例,而今分袂谈谈对他 起原:网海拾贝 因任务需要,要将寄存在sql ...

  8. SQL SERVER 数据库导入,导出之Bcp命令示例

    SQL SERVER 数据库导入,导出之Bcp命令示例 利用sql查询分析器中语句导入导出,bcp命令可直接在dos上运行,但须知必须语句必须写在一排上,不然语句执行不起会报错 xp_cmdshell ...

  9. Excel与Sql Server互通导入导出跨语言

    目录 Excel与Sql Server互通导入导出跨语言 1.目标Excel缺少表的列标题字段 1.1.问题的提出从这里开始 1.2.参数的正确写法 1.3.附带说一下Jet 4.0 1.4.附带说一 ...

最新文章

  1. 再见了Spring Cloud!这个架构有点厉害,甚至干掉了Dubbo!
  2. spring boot-The temporary upload location [ ] is not valid
  3. 索引 - 数据结构 - BTREE
  4. jQuery学习整理 (12)
  5. 使用JDBCTemplate实现与Spring结合,方法公用 ——Emp实现类(EmpDaoImpl)
  6. Linux——VIM学习选取多行(转)
  7. SU数据新旧格式转换问题
  8. 随想录(qemu仿真linux kernel)
  9. python灰度图cv2到plt变颜色_python中plt.imshow与cv2.imshow显示颜色问题
  10. vue中 jsbarcode的使用技巧
  11. 多媒体音箱选购指南--理论篇
  12. 华为手机怎么测试Android,华为手机怎么对硬件进行检测?华为手机硬件检测教程...
  13. 【NRF51822】DFU过程梳理
  14. 驱动开发之注册表:获取注册表HKEY_CURRENT_USER对应路径(SID)
  15. 垃圾分类,全民行动PPT模板
  16. php外翻截骨术,楔形截骨术与V形截骨术治疗拇外翻效果相似
  17. 2019上海交大计算机考研群,2019年科班二战上海交大计算机专硕,调剂非全初复试经验教训分享!...
  18. 无论是开放外链,或是回归实体,不同的互联网平台之间的高墙正在被推倒
  19. 前言技术之Oauth2全方面介绍
  20. Html5 css3 左箭头,利用CSS3特性巧妙实现漂亮的DIV箭头

热门文章

  1. 经典排序:第k个元素(快排和双向扫描法)
  2. LuaForUnity10:框架配置与AssetBundle
  3. opencv 图像傅里叶变换
  4. scikit-image 库简介
  5. C++ STL 各种搜索查找算法总结使用
  6. [Python] zip() 函数
  7. 只需订阅“全部文章”专栏便可查看所有文章
  8. docker 部署Gitlab
  9. hdfs+zookeeper+hbase分布式在k8s中部署(本文已过期)
  10. matlab2c使用c++实现matlab函数系列教程-sort函数