也想快乐的生活

好好扮演自己的角色,做自己该做的事

孟月天ID:xiaoxiaohai123
144680次访问,排名506好友2人,关注者14
软件开发
xiaoxiaohai123的文章
原创 148 篇
翻译 0 篇
转载 599 篇
评论 66 篇
最近评论
qpzkzp:Wow gold
xiaoxiaohai123:在Servlet 中读取请求头

在Servlet中读取HTTP头是非常方便的,只需要调用一下HttpServletRequest的getHeader方法即可。如果客户请求中提供了指定的头信息,getHeader返回对应的字符串;否则,返回null。部分头信息经常要用到,它们有专用的访问方法:getCookies方法返回Cookie头的内容,经解析后存放在Coo……
xiaoxiaohai123:HTTP客户程序(例如浏览器),向服务器发送请求的时候必须指明请求类型(一般是GET或者POST)。如有必要,客户程序还可以选择发送其他的请求头。大多数请求头并不是必需的,但Content-Length除外。对于POST请求来说Content-Length必须出现。 下面是一些最常见的请求头    Accept:浏览器可接受的MIME类型。    Accept-Charset:浏览器可接受的……
chinawes:为什么用服务器端的Image控件会出错?
xiaoxiaohai123:magic_quotes_sybase

如果打开的话,将会使用单引号对单引号进行转义而非反斜线。此选项会完全覆盖 magic_quotes_gpc。如果同时打开两个选项的话,单引号将会被转义成 ''。而双引号、反斜线 和 NULL 字符将不会进行转义。
文章分类
收藏
相册
技术链接
『 天道酬勤 』 www.LiTianPing.com
cool_rain_man的专栏
ericfine
frist we try
tvmark的专栏
VictorWu
wonderfullyh的专栏
zhanbos
吴现峰的对日软件开发专栏
孟子E章
宝玉的blog
小卢
屋顶上的木帷幕
开心就好的代码人生
心动空间
思归呓语
技术无止境
杂放
梅花学
此故为何
清清月儿
清清月儿 .NET万花筒
翱翔.Net Blog
老猫的理想
蝈蝈俊.net
邹建
闪亮的blog
阿山NET
技术论坛
andylin02
DFCG官方论坛
Donet论坛
GameRes交流论坛
itpub论坛
专注.NET技术
中天在线论坛
看雪学院
禁制社区
技术网站
.Net 框架快速入门
asp.net
vs2005.com
w3schools
数据库开发文档
无忧脚本
无忧视窗
月光软件
第九频道
驱动开发网
我得链接
博客
源码
源码网
源码首选
破釜沉舟
存档
软件项目交易
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
订阅到BlogLines
订阅到Yahoo
订阅到GouGou
订阅到飞鸽
订阅到Rojo
订阅到newsgator
订阅到netvibes

转载 sql server中三种导入导出数据方式(SQL语句、bcp、dts)收藏

新一篇: 数据绑定以及Container.DataItem的具体分析 | 旧一篇: 连接服务器 excel access

当我们建立一个数据库时,并且想将分散在各处的不同类型的数据库分类汇总在这个新建的数据库中时,尤其是在进行数据检验、净化和转换时,将会面临很大的挑战。幸好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 serveroracle等数据库来说)。要想引用其中的数据表或视图,必须在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

  上述的三种数据导入导出方法各有其利弊。

  二、性能的比较

  使用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时对数据进行快速导入导出的场合。

发表于 @ 2008年05月05日 14:06:24|评论(loading...)|编辑

新一篇: 数据绑定以及Container.DataItem的具体分析 | 旧一篇: 连接服务器 excel access

评论:没有评论。

发表评论  


当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
Csdn Blog version 3.1a
Copyright © xiaoxiaohai