|
在
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、
等数据库来说
)。要想引用其中的数据表或视图,必须在
OPENDATASOURCE(...)后进行引用。
OPENROWSET相当于一个记录集,可以将直接当成一个表或视图使用。
(2) 灵活度不同。
OPENDATASOURCE只能打开相应数据库中的表或视图,如果需要过滤的话,只能在
SQL Server中进行处理。而
OPENROWSET可以在打开数据库的同时对其进行过滤。因此,
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 -Usa
-P
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
和其它数据导入导出方式最大的不同就是它可以在处理数据的过程中对每一行数据进行深度处理。
上述的三种数据导入导出方法各有其利弊。
二、性能的比较
使用
Transact-SQL方式。如果是
SQL Server数据库之间的导入导出,速度将非常快,但是使用
OPENDATASOURCE和
OPENROWSET方法利用
OLE DB Provider打开并操作数据库时速度会慢一些。
使用
BCP命令方式。如果不需要对数据进行验证等操作的话,使用它还是非常快的,这是因为它的内部使用
DB-library,所以在操作数据库时速度有很大的提升。
使用
DTS方式导数据应该是最好的方式了。由于它整合了
Microsoft Universal Data Access技术与
Microsoft ActiveX技术,因此不仅可以灵活地处理数据,而且在数据导入导出的效率是非常高的。
三、总结及建议
如果是在
SQL Server数据库之间进行数据导入导出时,并且不需要对数据进行复杂的检验,最好使用
Transact-SQL方法进行处理,因为在
SQL Server数据库之间进行数据操作时
,SQL是非常快的。当然,如果要进行复杂的操作,如数据检验、转换等操作时,最好还是使用
DTS进行处理,因为
DTS不光导数据效率高,而且能够对数据进行深度控制。但是
DTS的编程接口是基于
com的,并且这个接口十分复杂,使用程序调用
DTS将变也会变得很复杂,因此
, 当数据量不是很大,并且想将数据导入导出功能加入到程序中,而且没有复杂的数据处理功能时,可以使用
OPENDATASOURCE或
OPENROWSET 进行处理。
BCP
命令并不太适合通过程序来调用,如果需要使用批量的方式导数据,可以通过批处理文件调用
BCP命令,这样做即不需要编写大量的程序,也无需在企业管理器中通过各种操作界面的切换来进行数据导入导出。因此,它比较适合在客户端未安企业管理器或使用
SQL Server Express时对数据进行快速导入导出的场合。
|