【转载】 在工作中,而且还是项目上线割接中碰到,结果电话号码数据全乱套了,后果很严重,幸好,在网上找到了这篇文章,有了解决的指望,希望下周一客户能允许我在生产库解决掉这个问题。
在Excel中,我们时常会碰到这样的字段(最常见的就是电话号码),即有纯数字的(如没有带区号的电话号码),又有数字和其它字符混合 (如“区号-电
话号码”)的数据,在导入sqlServer过程中,会发现要么纯数字的数据导过去之后变成了NULL,要么就是数字和其它字符混合的数据导过去之后变成
了NULL。
为什么有些是纯数字的数据导过去之后变成了NULL,有些却是数字和其它字符混合的数据导过去之后变成了NULL,原来是在将Excel数据导入
sqlServer过程中,sqlServer会做出判断,是采用float型还是nvarchar型来接受数据,测试发现(没有科学依据),sqlServer采用哪一型取决于将要导入
的数据中本身具有哪一型的记录数比例多,如10笔数据,有4笔没有带区号的电话号码,6笔是带区号的电话号码,那么转到sqlServer就会选择
nvarchar型,结果就是4笔没有带区号的电话号码导过去之后全成了NULL,反之亦然。不管怎么样,我们最终都希望sqlServer是采用nvarchar来接受
数据,毕意我们要导入的数据中有数字和其它字符混合的数据,用float型来接受是不可能的,这样只要我们解决了将纯数字的数据转换成字符型并让
sqlServer接受就可以了。
我首先想到的就是将这个字段的所有数据在Excel中设置为文本格式,刚才说了本来就是希望导入sqlServer时成为字符型,但结果令人失望,不起
作用。
最终网上搜索到了答案:混合数据类型列的强制解析——IMEX=1
使用 IMEX=1 选参之后,只要取样数据里是混合数据类型的列,一律强制解析为 nvarchar/ntext 文本。当然,IMEX=1 对单一数据类型列的解析是不影
响的。
SELECT * INTO Table08 FROM OpenDataSource ('Microsoft.Jet.OLEDB.4.0','Data Source="E:/1.xls";Extended properties="Excel 5.0;HDR=Yes;IMEX=1;"')...[Sheet1$] 注: 1.这条语句是在sqlServer查询分析器中执行,并且要选择好数据库,否则会把要导入的数据往别的数据库中导了。 2.Table08是数据导入后在sqlServer中的表名,属于新建,所以请确认在导入数据前数据库中没有该表名,否则会提示已存在同一表名。 3.Data Source,不要连在一起写,中间有一空格。 4.E:/1.xls,为Excel所在的绝对路径和数据库名。 5.Excel 5.0,根据不同的Excel版本写5.0或8.0或其它。 6.IMEX=1,是转换成文本输入的意思,非常重要,如果没有,就跟你直接导入效果一样。 7.Sheet1是表名,千万别看到语句中有$就在表名后加上$,因为$是语句要加的,别画蛇添足。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。