【IT168 技术文档】当我们建立一个数据库时,并且想将分散在各处的不同类型的数据库分类汇总在这个新建的数据库中时,尤其是在进行数据检验、净化和转换时,将会面临很大的挑战。幸好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
|
命令行工具bcp
|
DTS
|
图形管理界面
|
无
|
无
|
有
|
操作难易程度
|
容易
|
较复杂
|
复杂
|
编程接口
|
SQL
|
系统存储过程或通过shell直接调用
|
com组件
|
数据处理
|
只能对数据进行简单的过滤
|
只能对数据进行简单的过滤
|
可以利用脚本对数据进行复杂的处理
|
二、性能的比较
使用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时对数据进行快速导入导出的场合。
【原文地址:http://tech.it168.com/db/s/2006-08-02/200608020911005.shtml】
分享到:
相关推荐
### SQL Server 数据与 Excel 表的导入导出详解 #### 一、概述 在数据库管理领域,数据导入导出是一项非常重要的技能。无论是为了合并数据、归档还是数据分析,甚至是开发应用程序或升级数据库,数据迁移都是必不...
#### SQL Server 数据导入导出概述 SQL Server 提供了多种工具和技术来实现数据的导入导出,包括但不限于Transact-SQL语言、命令行工具BCP以及数据转换服务(DTS)和SQL Server Integration Services (SSIS)。这些...
本文将详细介绍如何在Oracle数据库和SQL Server 2005之间进行数据的导入导出操作,即数据的共享过程。这包括了从Oracle导出数据到SQL Server 2005,以及反向的数据迁移。 #### 数据迁移背景 数据迁移通常涉及到两...
### 数据导入导出技术概述 数据导入导出技术在数据库管理中扮演着至关重要的角色,尤其是在需要处理来自多个来源的数据时。随着业务需求的增长和技术的进步,有效地管理和利用这些数据成为了组织成功的关键因素之一...
### SQL Server SQL语句导入导出大全:深入解析与应用 #### 一、概述 在数据库管理中,数据的导入导出是一项常见的操作,尤其是在进行数据迁移、备份或数据分析时。SQL Server提供了多种方法来实现数据的导入导出...
`BCP`(Bulk Copy Program)是SQL Server提供的一种批量复制工具,主要用于快速地导入导出数据。通过`BCP`命令,可以非常方便地将表中的数据导出到文本文件,再将该文本文件转换为Excel格式。 **示例代码**: ```...
BCP(Bulk Copy Program)是SQL Server的一个工具,用于快速导入导出大量数据。 #### 2. BCP命令解析 - **`exec master..xp_cmdshell`**:调用扩展存储过程执行操作系统命令。 - **`bcp "select * from servername...
本文档旨在全面介绍SQL Server与各类数据库之间的数据导入导出方法,特别关注了SQL语句在实际应用中的具体操作流程。这些技术不仅适用于SQL Server,也涵盖了与其他数据库系统交互的方式,如通过Excel文件、文本文件...
### Sqlserver大数据量插入速度慢或丢失数据的解决方法 #### 概述 在处理大量数据插入SQL Server数据库的过程中,可能会遇到插入速度慢或者数据丢失的问题。这种情况通常出现在需要批量插入数千甚至上万条记录的...
以上知识点概述了SQL Server在数据导入方面的主要内容和操作方法,涵盖了数据导入工具、数据源类型、性能优化以及常见的问题解决策略。希望这些知识点能为需要在SQL Server环境下进行数据导入操作的专业人士提供有...
本案例中,"sql数据库数据导入到oracle"的主题涉及从SQL Server数据库将数据转换并导入到Oracle数据库的过程。下面我们将详细探讨这一过程涉及的知识点。 1. **SQL Server和Oracle概述**: SQL Server是由...
### 数据导入导出概述 数据导入导出是数据库管理中的重要组成部分,用于将数据从一个系统或格式转移到另一个系统或格式。这种转移可以是为了备份目的、数据迁移或是与其他系统共享数据等。SQL Server 提供了多种...
无论是为了备份数据、迁移数据还是为了数据的安全存储与恢复,掌握有效的数据导入导出方法都是必不可少的技能之一。本文档旨在为运维人员提供一套关于SQL Server 2008数据库数据导入(恢复)、导出的操作指南。 ###...