当前位置: 首页 > 编程日记 > 正文

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

注:本文转载自 http://blog.csdn.net/nokiaguy/article/details/4684822

当我们建立一个数据库时,并且想将分散在各处的不同类型的数据库分类汇总在这个新建的数据库中时,尤其是在进行数据检验、净化和转换时,将会面临很大的挑战。幸好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("婚姻状况") =1Then     DTSDestination("婚姻状况") ="已婚"   Else     DTSDestination("婚姻状况") ="未婚"   EndIf   Main = DTSTransformStat_OK End Function

二、性能的比较
    使用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/Qiaoyq/archive/2012/09/20/2695231.html

相关文章:

【直播】李祖贤:集成学习答疑直播之八-- 集成知识点回顾与补充

集成学习答疑直播之八-- 集成知识点回顾与补充 集成学习是首个横跨3个周期的长期组队学习,在第25期组队学习中进行到“第三期-模型融合与数据实战”阶段。组队学习期间,课程设计者每周针对学习任务的重难点和学员的学习情况进行集中直播答疑,…

Python培训完可以找什么工作

近几年学习Python技术的人越来越多,对于Python这个行业很多人都是比较看好的,事实也确实如此,那么具体Python培训完可以找什么工作呢?现在学习Python好就业吗?来看看下面的详细介绍吧。 Python培训完可以找什么工作?Python是一种面向对象的…

上传图片时出现Request 对象 错误 'ASP 0104 80004005'

原因.IIs默认的上传大小为200K,当上传的文件超过此大小.则会出现此错误 解决办法: 1.关闭IIS Admin Service服务 2.更改C:\WINDOWS\system32\inetsrv目录下的MetaBase.xml 文件,将第601行的AspMaxRequestEntityAllowed204800.更改为AspMaxRequestEntityAllowed5120000(5120000是…

Datawhale组队学习周报(第013周)

本周(05月10日~05月16日),第 25 期组队学习正在如火如荼的进行中。本期组队学习,一共有 3 门开源课程,共组建了 3 个学习群,参与的学习者有 292 人。另外,第 26 期组队学习也蓄势待发准备与大家…

subst将文件夹目录虚拟成虚拟磁盘

SUBST [drive1: [drive2:]path]SUBST drive1: /Ddrive1: 指定要指派路径的虚拟驱动器。[drive2:]path 指定物理驱动器和要指派给虚拟驱动器的路径。/D 删除被替换的 (虚拟) 驱动器。不加任何参数键入 SUBST,可以显示当前虚拟驱动器的清单。本文…

UI设计学习的对比原则怎么运用?

本期小编为大家介绍的UI设计培训教程就是关于UI设计学习的对比原则怎么运用?因为在UI设计中分组原则这一项在文字排版中运用的几率是比较频繁的,并且分组对于层次感和整合信息都有一定的帮助,但是光有分组还远远不够,尤其是零基础学ui我们还…

silverlight数据库应用程序开发

该解决方案使用的是"silverlight导航应用程序Oracle数据库WebService服务” 新建silverlight项目GH,同时会自动添加一个GH.Web,在GH.Web中添加"web 服务",同时需要添加两个XML文件用于解决跨域问题: 第一个XML文件&#xff1a…

如何设置matplotlib中x,y坐标轴的位置?

在机器学习中经常会使用Sigmoid函数,如果直接使用matplotlib绘图,那么就会像下图这样,原点并没有在(0,0)。 import matplotlib.pyplot as plt import numpyx numpy.linspace(start-10, stop10) y 1 / (1 numpy.e ** (-1 * x))plt.plot(x,…

Python中的类、模块和包究竟是什么?

Python培训教程:Python中的类、模块和包究竟是什么?在Python和其他编程语言中,都有类似或相同的概念,如对象、类、模块、包,名称都是一样的,只不过会有细微的一些区别,正是因为有这些存在,才使…

Test class should have exactly one public constructor解决办法

测试类用的junit,在eclipse中执行ok,在maven编译就挂 Error MessageTest class should have exactly one public constructor Stacktracejava.lang.Exception: Test class should have exactly one public constructorat org.junit.runners.BlockJUnit4C…

中矿大新生赛 A 求解位数和【字符串】

时间限制:C/C 1秒,其他语言2秒空间限制:C/C 32768K,其他语言65536K64bit IO Format: %lld题目描述 给出一个数x,求x的所有位数的和。输入描述: 第1行输入组数T,代表有T组数据。第2-T1行,每行输入…

学软件测试的优势有哪些

软件测试培训岗在各大招聘网站上越来越多,很多公司都对软件测试这个岗位有需求,那么具体学软件测试的优势有哪些呢?来看看下面的详细介绍就知道了。 软件测试培训:学软件测试的优势有哪些? 工作起点高,发展空间大 开始工作即进入…

C++项目中的extern C {}

2010-07-10 19:45 by 吴秦, 92864 阅读, 22 评论, 收藏, 编辑 引言 在用C的项目源码中,经常会不可避免的会看到下面的代码: ?123456789#ifdef __cplusplusextern "C" { #endif/*...*/#ifdef __cplusplus}#endif它到底有什么用呢,你…

C# 自定义事件和委托

http://www.cnblogs.com/huomm/archive/2007/12/04/982869.html 转载于:https://www.cnblogs.com/xxvv/archive/2012/09/22/3648589.html

参加UI培训有发展吗?

UI设计岗在最近的很多招聘网上都越来越多,逐渐引起了很多人的关注,大家都想知道转行参加UI培训有发展吗?本篇文章就和大家分享一下。 参加UI培训有发展吗? 先来看看UI设计的现状,UI设计行业这几年发展非常快,目前已经初具规模&a…

lampp开机启动

安装好之后,输入以下命令即可: ln -s /opt/lampp/lampp /etc/rc.d/rc3.d/S99lampp ln -s /opt/lampp/lampp /etc/rc.d/rc4.d/S99lampp ln -s /opt/lampp/lampp /etc/rc.d/rc5.d/S99lampp转载于:https://www.cnblogs.com/imkun/archive/2012/09/23/269929…

Properties类读写配置文件

Properties类读写简单配置文件相当的方便,以前竟然没注意到这个类。 FileInputStream fs new FileInputStream("config.ini"); Properties pros new Properties(); pros.load(fs); pros.setProperty("test", &…

如何在Jupyter Lab中显示pyecharts的图形?

这篇图文是《如何利用pyecharts绘制酷炫的桑基图?》的补充。 在这篇图文中给出的代码是使用pycharm调试的,而自己分享的时候,是使用Jupter Lab。 如果沿用这篇文章的代码,渲染后的图形仍然需要到sankey.html文件中查看&#xff…

参加web前端培训要学会哪些技能

想要成为一名合格的web前端程序猿,要学习的东西有很多,那么参加web前端培训要学会哪些技能呢?来看看下面的详细介绍就知道了。 参加web前端培训要学会哪些技能?想从事web前端开发,只会HTML、CSS和JavaScript这三个要素是远远不够的。身为一…

微软的研发思路发生改变了 Visual Studio 2012 Update 1抢先看

随着微软上周正式发布Visual Studio 2012,微软公司随即宣布了他们的下一版本。Update 1的CTP(社区技术预览)版预计本月底可用,而Update 1的最终版应该2012年底可用。微软曾表示,他们希望在VS2012上实现的若干目标之一是…

json的序列化与反序列化

json 是一种轻量级的数据交换格式,也是完全独立于任何程序语言的文本格式。 本文介绍json字符串的序列化与反序列化问题。 序列化 是指将变量(对象)从内存中变成可存储或可传输的过程。反序列化 是指将变量内容从序列化的对象重新读到内存里…

socket 995 错误 boost

这个错误的中文解释是:由于线程退出或应用程序请求,已中止 I/O 操作。 最近几天学习boost asio 在抄官方的一个实例代码时遇到 了,这个错误搞了我三天才解决,就是在一行代码中少了一个 s 所致。 正确的代码是这样 的 boost::asio:…

几何图形在logo设计中的有哪些情感意义?

作为一名合格的UI设计师,工作中遇到的问题有很多,例如logo设计,是很多UI设计师的一个日常工作之一,小编今天为大家介绍的UI设计培训教程就是几何图形在logo设计中的有哪些情感意义?希望能够帮助到大家。 UI设计培训教程&#xff…

Linux自学笔记——haproxy

HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠地一套解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在时下的硬件上,完…

如何利用pyecharts绘制炫酷的关系网络图?

如何利用pyecharts绘制炫酷的关系网络图 这是本学期在大数据哲学与社会科学实验室做的第六次分享了。 第一次分享的是: 如何利用“wordcloudjieba”制作中文词云? 第二次分享的是: 如何爬取知乎中问题的回答以及评论的数据? …

设Excle的cell中显示一个下拉列表选择框

描述:我想让excle的sheet页中的B列的每个cell输入内容的时候将A列所有行的内容作为下拉列表的选择内容 效果如下: 实现的步骤如下: 1.点击B列的头,选中整列 2.点击菜单栏的“数据”-》“数据有效性”,弹出如下的对话框…

Python培训中有哪些是必须学的运算符

不管是学Python技术还是其他的编程技术,运算符的学习都是少不了的,本期小编为大家推荐的教程就是关于Python培训中有哪些是必须学的运算符?来看看下面的详细介绍内容。 Python培训中有哪些是必须学的运算符? 布尔值:值只有两个,…

centos6 搭建heartbeat

Heartbeat是High-Availability Linux Project (Linux下的高可用性项目)的产物,是一套提供防止业务主机因不可避免的意外性或计划性宕机问题的高可用性软件。Heartbeat可以从Linux-HA 项目Web 站点免费获得,它提供了所有HA (高可用性&#xff…