读取EXCEL数据到SQL的方法很多,但是今天这个问题困扰了我很长时间,最后终于解决了,现在总结一下。
有一EXCEL文件,格式如下:
EXEC('select * into bpl_from from '+@SqlString)
@fname nvarchar(250), --文件名
@sheetname varchar(250)='' --sheet页名
因为 OLE DB 访问接口 'Microsoft.Jet.OLEDB.4.0'配置为在单线程单元模式下运行,所以该访问接口无法用于分布式查询
exec sp_configure 'show advanced options',1
reconfigure
exec sp_configure 'Ad Hoc Distributed Queries',1
reconfigure
--使用完成后,关闭Ad Hoc Distributed Queries:
exec sp_configure 'Ad Hoc Distributed Queries',0
reconfigure
exec sp_configure 'show advanced options',0
reconfigure
按照这种方法运行到reconfigure 语句进行安装时,错误又来了:不支持对系统目录进行即席更新。
SQL SERVER从2005开始,与2000的区别就很大了,虽说优点不少,但是使用上还是有很多的不便了。最后查找资料,reconfigure需要加上 WITH OVERRIDE才可以正常执行。问题解决。
这个问题解决了,可是第一个问题还是会出现,怎么办?原来是该EXCEL文件不在SQL SERVER 服务器上的原因。后将该EXCEL文件放到服务器上,再执行SQL脚本,结果发现,问题依然存在,我都无语了。。。
但是困难再大也不能阻止我解决问题的决心。于是继续查找资料,这次很费了一番苦心,终于找到了答案。
原来是在64位的SQL Engine中已经不提供jet.oledb.4.0的驱动了,解决办法是把连接字符串的Microsoft.jet.Oledb.4.0 更改为 Microsoft.ACE.OLEDB.12.0,前提是先要下载安装一个ACE.Oledb.12.0 for X64位的驱动
又经过一番折腾,心想这次总可以解决问题了吧。呵呵,高兴太早了,这个问题是解决了,可是又出现了新的问题:
消息 468,级别 16,状态 9,过程 p_ExcelToSQL,第 57 行
无法解决 equal to 运算中 "Chinese_PRC_CI_AS" 和 "SQL_Latin1_General_CP1_CI_AS" 之间的排序规则冲突
查看出问题的代码:
INSERT INTO #tmp_FromExcel(BarCode,ItemCode,SizeSite,Num)
SELECT A.BarCode,B.ItemCode,B.SizeSite,A.Num
FROM #ExcelTbl A
INNER JOIN edp_barcode B ON (A.BarCode = B.BarCode);
仔细分析,是排序规则出了问题。检查发现,我的数据库的排序规则是Chinese_PRC_CI_AS,由于使用了临时表#tmp_FromExcel和#ExcelTbl,而临时表是存在系统数据库tempdb中的,系统数据库tempdb的排序规则正是SQL_Latin1_General_CP1_CI_AS,找到了问题所在。既然是排序规则的冲突问题,那修改数据库的排序规则不就得啦?且慢,要知道,系统数据库的排序规则是无法修改的。那改我的数据库?由于不太清楚数据库的排序规则有什么作用,又担心修改了会对数据库造成其他影响,心想还是算了吧,想想其他的解决办法。
既然这样,我不用这种带#号的临时表是不是可以呢?抱着试一试的想法,我对SQL脚本做了部分修改,将所有带#号的临时表,全部用@table这样的表参数代替,比如:
CREATE TABLE #tmpTable(
BarCode CHAR(13),
ItemCode CHAR(16),
-SizeSite VARCHAR(7),
-Num INT
);
替换为:
DECLARE @tmp_FromExcel TABLE(
BarCode CHAR(13),
ItemCode CHAR(16),
SizeSite VARCHAR(7),
Num INT
);
修改后执行,问题解决!