在Excel中,咱们时常会碰到这样的字段(最多见的就是电话号码),即有纯数字的(如没有带区号的电话号码),又有数字和其它字符混合 (如“区号-电
sql
话号码”)的数据,在导入SQLServer过程当中,会发现要么纯数字的数据导过去以后变成了NULL,要么就是数字和其它字符混合的数据导过去以后变成数据库
了NULL。安全
为何有些是纯数字的数据导过去以后变成了NULL,有些倒是数字和其它字符混合的数据导过去以后变成了NULL,原来是在将Excel数据导入服务器
SQLServer过程当中,SQLServer会作出判断,是采用float型仍是nvarchar型来接受数据,测试发现(没有科学依据),SQLServer采用哪一型取决于将要导入ide
的数据中自己具备哪一型的记录数比例多,如10笔数据,有4笔没有带区号的电话号码,6笔是带区号的电话号码,那么转到SQLServer就会选择测试
nvarchar型,结果就是4笔没有带区号的电话号码导过去以后全成了NULL,反之亦然。无论怎么样,咱们最终都但愿SQLServer是采用nvarchar来接受.net
数据,毕意咱们要导入的数据中有数字和其它字符混合的数据,用float型来接受是不可能的,这样只要咱们解决了将纯数字的数据转换成字符型并让get
SQLServer接受就能够了。it
我首先想到的就是将这个字段的全部数据在Excel中设置为文本格式,刚才说了原本就是但愿导入SQLServer时成为字符型,但结果使人失望,不起io
做用。
最终网上搜索到了答案:混合数据类型列的强制解析——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是表名,千万别看到语句中有$就在表名后加上$,由于$是语句要加的,别多此一举。
-------------------------------------------------------------------------------------------
执行时发现
消息 15281,级别 16,状态 1,第 1 行
SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT 'OpenRowset/OpenDatasource' 的访问,由于此组件已做为此服务器安全配置的一部分而被关闭。系统管理员能够经过使用 sp_configure 启用 'Ad Hoc Distributed Queries'。有关启用 'Ad Hoc Distributed Queries' 的详细信息,请参阅 SQL Server 联机丛书中的 "外围应用配置器"。
------开启
exec sp_configure 'show advanced options',1 reconfigure exec sp_configure 'Ad Hoc Distributed Queries',1 reconfigure
------关闭
exec sp_configure 'Ad Hoc Distributed Queries',0 reconfigure exec sp_configure 'show advanced options',0 reconfigure