代码改变世界

Excel的两种导入方式ACE和JET

2013-01-07 07:22  Andy Ge  阅读(804)  评论(0编辑  收藏  举报
declare @dt datetime = getdate()

--ACE导入2007格式Excel
SELECT * into #t1 FROM OPENROWSET('microsoft.ace.oledb.12.0','Excel 12.0;database=d:\生物.xlsx', 'select * from [生物$]')

select DATEDIFF(ms,@dt,getdate())

set @dt = GETDATE()

--导入97--2003格式Excel
SELECT * into #t2 FROM OPENROWSET('microsoft.jet.oledb.4.0','Excel 8.0;database=d:\生物.xls', 'select * from [生物$]')

select DATEDIFF(ms,@dt,getdate())

drop table #t1
drop table #t2
go

---同样的数据内容,导入2007格式耗时3593毫秒,导入97--2003格式耗时810毫秒,由此可见ACE导入较为耗时

--ACE导入中,Excel改成了8.0竟然也可以导入
SELECT * into #t1 FROM OPENROWSET('microsoft.ace.oledb.12.0','Excel 8.0;database=d:\生物.xlsx', 'select * from [生物$]')

--ACE也可导入97--2003格式Excel
SELECT * into #t2 FROM OPENROWSET('microsoft.ace.oledb.12.0','Excel 8.0;HDR=yes;database=d:\生物.xls', 'select * from [生物$]')
--上述语句其中"HDR=Yes,这代表第一行是标题,不做为数据使用 ,如果用HDR=NO,则表示第一行不是标题,做为数据来使用。系统默认的是YES

drop table #t1
drop table #t2
go
--
--ACE导入中,支持表单名称包含特殊字符
SELECT * into #t1 FROM OPENROWSET('microsoft.ace.oledb.12.0','Excel 12.0;database=d:\生物.xlsx', 'select * from [生物(单科)$]')

--ACE不支持默认表单名称导入,否则返回消息 "无效的 SQL语句;期待 'DELETE'、'INSERT'、'PROCEDURE'、'SELECT'、或 'UPDATE'。"。
--SELECT * into #t2 FROM OPENROWSET('microsoft.ace.oledb.12.0','Excel 8.0;HDR=yes;database=d:\生物.xls', '[生物(单科)$]')
--上述语句其中"HDR=Yes,这代表第一行是标题,不做为数据使用 ,如果用HDR=NO,则表示第一行不是标题,做为数据来使用。系统默认的是YES

drop table #t1


其中OpenRowset的组后一个参数既可以是表单名称(注不添加引号,并且格式为[SheetName$]),或者为select查询字符串,如果表单名称中包含特殊字符如括号等,则需要采用第二种方式。