SQL Server中导入导出数据的三种方式(2)
作者:891913 来源:赛迪网 发布时间:2008-11-28 15:53:00
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如示。
<>B二、性能的比较
使用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时对数据进行快速导入导出的场合


猜你喜欢
- (1) 展示了ASP * 站设计的一些最基本的方法,相信通过实践各位对ASP已经有了最基本的了解,本篇在答复大家所提问题的同时,将进一步介绍
- __init__ 方法是什么?使用Python写过面向对象的代码的同学,可能对 __init__ 方法已经非常熟悉了,__init__ 方法
- Python果然是一款非常简明的语言,做东西非常流畅,今天又尝试了一下用Serial做了一个控制台的串口通讯,我用的下位机是STM32F10
- python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU资源,在python中大部分情况需要使用多进程。python提供了
- 这里的搜索功能主要基于表单get提交实现的<form action="/backend/auditList" me
- 假如有个任务: 给定一个字符串,通过查询字典,来替换给定字符中的变量。如果使用通常的方法:>>> "This i
- 使用python时,程序能运行,但是不能调试,找了半天解决方法,最后此操作分分钟奏效。两种方法:方法一:选中要运行的代码,右键Execute
- 第一步:获取mysql YUM源进入mysql官网获取RPM包下载地址https://dev.mysql.com/downloads/rep
- 一个线上问题的引发的思考 今天上班的时候,开发的同事拿过来一个.zip的压缩包文件,说是要把里面的数据
- ckptfrom tensorflow.python import pywrap_tensorflow checkpoint_path =
- python如何修改索引和行列修改索引修改索引之前是自动生成的索引:使用set_index('以xx字段为索引',inpla
- onmouseout 发现它的触发太敏感,当经过层内文字链时,即触发onmousetout事件,功能不能正常显示,经过一番搜索,整理出来,供
- cgo 使得在 Golang 中可以使用 C 代码。Hello World为了有一个较为直观的了解,我们来看一个简单的例子,创建文件 mai
- 系统环境:Centos6.5 64位一. 安装java环境 这里安装的是jdk1.7.60在/usr/local目录下创建java目录,可到
- 目录时间戳相减装饰器timeit模块重复调用 timeit()cProfile性能分析工具时间戳相减在代码执行前后各记录一个时间点,两个时间
- 简单的说,析构函数是用来在对象关闭时完成的特殊工作,比如我写的上例,在实例化同时打开某文件,但是它什么时候关闭呢,用完就关闭呗,所以析构函数
- 因为要用到过滤一组中重复的数据,使之变成没有重复的一组数据的功能,百度了一下,居然有朋友乱写,而且比较多,都没有认真测试过,只对字符可以,但
- 我们在编写asp程序时经常会使用到这个功能,一般我们这样判断如:if a="" then ,而这个函数考虑的就比较全面了
- 四兄弟的背景在一个名为编程语言的村庄里,有不同姓氏的村民。例如Java、Python、Golang、JavaScript等姓氏,而接下来要介
- 前言提示:以下是本篇文章正文内容🍒PIL库概述PIL库支持图像存储、 显示和处理, 它能够处理几乎所有图片格式, 可以完成对图像的缩放、 剪