批量将Access 2000 的mdb文件导入到SqlServer 2005中

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介:

       场景:需要将一批Access 2000的mdb文件导入到Sql server 2005,Access数据库文件大概有几百个,全部结构相同,有同样的表名main0;总数据大概在5000w

显然用DTS数据导入导出是不太可能的事情,每个ACCESS表导入的时间都在10分钟到30分钟不等,人不可能守着点鼠标赛。

       那么只有用sql语句导入了。

       本打算采用bcp来操作,bcp导一个1000万行的txt文本也用不了多久,但是bcp怎么导入mdb文件还真没试过。(有操作过的请指点下)

       假设SQL中创建了与mdb的main0表同结构的表,表名也为main0;导入access数据库到SQL的语句为

范例1:


1
2
3
Insert  into   main0   select  *
FROM  OPENDATASOURCE ( 'Microsoft.Jet.OLEDB.4.0' ,
       'Data Source="d:\mdb\20131222\xxxxxxxx.mdb";User ID=Admin;Password='  )...main0 ;

为了查看已经导入了多少mdb,可以先建立一张表。

范例2:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
create  table  importdb(
dbname nvarchar( max ),
dbcount  int
)
DECLARE  @countall  int
DECLARE  @countnow  int
set  @countnow=0
--1989 before
Insert  into   main0   select  *
FROM  OPENDATASOURCE ( 'Microsoft.Jet.OLEDB.4.0' ,
       'Data Source="d:\zk\20131222\xxxxx.mdb";User ID=Admin;Password='  )...main0 ;
set  @countall=( SELECT   b. rows    FROM       sysobjects  AS  INNER  JOIN   sysindexes  AS  ON  a.id = b.id   WHERE    (a.type =  'u' AND  (b.indid  IN  (0, 1)  and  (a. name = 'main0' ) ) )
set  @countnow=@countall-@countnow
Insert  into  importdb(dbname,dbcount)  values ( 'xxxxx.mdb' ,@countnow);

这样 可以在导入的过程中随时

1
select  from  importdb

来查看已经导入了多少mdb文件,并且每个mdb文件导入了多少条数据。

这里没有使用 select count(*) from main0 而是使用

1
SELECT   b. rows    FROM       sysobjects  AS  INNER  JOIN   sysindexes  AS  ON  a.id = b.id   WHERE    (a.type =  'u' AND  (b.indid  IN  (0, 1)  and  (a. name = 'main0' ) )

来统计表里的行数,原因是这样速度快的多,恩,不能说是快的多,因为这个是秒出结果,而

1
select  count (*)  from  main

慢的不能忍受,尤其是正在导入数据的时候做这个查询。


     知道一个mdb怎么导入了,那么如何批量导入呢?


      先遍历目录下的所有mdb文件,把遍历结果写入到一个临时表中;然后做个游标,查询这个临时表,每查到一行,数据表里的内容(mdb文件名)到变量中,进行组装sql语句;然后exec这个sql语句进行导入操作。

范例3:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
--Write By Skybug
-- 2013-12-22
--导入指定目录下的所有mdb到SQL server中
CREATE  TABLE  #(
files nvarchar( max ))  --创建临时表# (这个临时表的表名是#不是shell的注释符哈)
insert  exec  xp_cmdshell  'dir /B d:\mdb\20131222\*.mdb'   --遍历所有的mdb插入另时临时表
declare  @filesname  varchar (200)  --定义变量mdb文件名
declare  @cmd1  varchar (2000)   --定义变量 需要执行的sql串
DECLARE  filesname  CURSOR  FOR --定义游标
           select  [files]  from  #
Open  filesname --打开游标
         FETCH  NEXT
         FROM  filesname
         into  @filesname
WHILE @@FETCH_STATUS = 0
     BEGIN
         set  @cmd1= 'Insert into  main0  select * FROM OPENDATASOURCE (' + '' '' + 'Microsoft.Jet.OLEDB.4.0' + '' '' + ',' + 'Data Source="d:\mdb\20131222\'+@filesname+' "; User  ID=Admin; Password = '+' '' '+'  )...main0 ; '
         exec (' '+@cmd1+' ');
         --print @cmd1
         FETCH  NEXT
         FROM  filesname
         into  @filesname
     end
CLOSE  filesName --关闭游标
DEALLOCATE  filesName
drop  table  --删除临时表



这样就能遍历目录下的所有mdb文件并执行导入了。

如果需要随时查看导入进度,可以参照范例2,while循环中每次游标移动前,把@filesname 和@countnow 写到表中用来查看进度。

————————————————————————————————————————————

需要注意的:在写范例三中的@cmd1的时候,把自己给搞晕了;将范例1中的sql语句 转成@cmd1字符串的时候,需要注意,原SQL语句里就有'单引号;在组装@cmd1SQL语句字符串的时候,用单引号分成几段加起来,语句中的单引号用''''4个单引号来代替。

既:原语句如果是

aaa bb ccc 'ddddd' eeee

组装字符串的时候就是

'aaa bbb ccc '+''''+'dddd'+''''+'eeee'




      本文转自天山三害 51CTO博客,原文链接:http://blog.51cto.com/skybug/1343819,如需转载请自行联系原作者




相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
相关文章
|
7月前
|
SQL 数据挖掘 数据库
数据库数据恢复-SQL SERVER数据库文件误还原备份的数据恢复方案
SQL SERVER数据库故障类型: 1、SQL SERVER数据库文件被删除。 2、SQL SERVER数据库所在分区格式化。 3、SQL SERVER数据库文件大小变为“0”。 4、使用备份还原数据库时覆盖原数据库。
|
9月前
|
数据库 C#
C#,.net,winform导入Excel功能以及下载Excel文件到本地,并使用SqlBulkCopy把DataTable类型的数据写入到sqlserver数据库中
C#,.net,winform导入Excel功能以及下载Excel文件到本地,并使用SqlBulkCopy把DataTable类型的数据写入到sqlserver数据库中
220 0
|
10月前
|
数据库 数据库管理
sqlite数据库文件导入到sqlserver
sqlite数据库文件导入到sqlserver
325 0
|
存储 SQL 数据库
SQLServer数据库文件相关知识笔记
数据库文件是SQLServer数据库的物理体现,和计算机的普通文件一样存储在计算机的磁盘空间当中。作为数据库记录和日志等其他信息的存储载体。
SQLServer数据库文件相关知识笔记
sqlserver导出带数据的脚本文件(下)
sqlserver导出带数据的脚本文件(下)
112 0
sqlserver导出带数据的脚本文件(下)
|
SQL 安全 程序员
sqlserver导出带数据的脚本文件(上)
sqlserver导出带数据的脚本文件(上)
199 0
sqlserver导出带数据的脚本文件(上)
|
SQL Oracle 关系型数据库
Oracle、DB2、SQLSERVER、Mysql、Access分页SQL语句
最近把平时在项目中常用到的数据库分页sql总结了下。大家可以贴出分页更高效的sql语句。
161 0
|
文件存储 Windows
SQLServer使用NAS SMB文件卷
SQLServer可以使用NAS SMB文件卷的问题,实现运营托管,高可用,超大容量,文件共享等目标。
4550 0
SQLServer使用NAS SMB文件卷
|
SQL 安全 关系型数据库
解决 | 此数据库文件跟当前sql server实例不兼容 & sql server2008无法连接到(local)
最近在搞ASP.NET,因实验室VS版本跟PC不一样可能,拷回来一打开就这样子: 眉头一皱的我打开我的古董SQL,自从用了MySQL就没碰它了我的锅。
1301 0