EXCEL 导入MSSqlserver数据库报错

通过navicat12倒出数据,文件格式是xls,但在xls修改完数据后再往数据库便导入便报错。此外因为数据量很大,超过24万条数据,但xls格式导出的内容只有6万多数据。不过最后还是解决了。

碰到的问题

  1. xls数据行数支持不足
  2. xlsx和xls使用vlookup函数后报错,找不到对应数据(因为表格上是由绿色三角
  3. 主键约束问题
  4. xlsx格式中日期与数据库中datatime格式不符合
  5. sqlserver自增长列标识导入的时候报错【这个是最坑的一切的源头!

1.xls数据行数支持不足

也是头一次遇到需要面对excel行数不足的问题,数据大约有24万,对2003版,最大行数是65536行,对2007以上版本,最大行数是1048576行

在Excel里用Ctrl+向下方向键可以到达最后一行进行验证。还好xlsx支持百万行数据,在navicat中导出的格式选择xlsx就好了。(导出的时候xlsx文件可能会有问题,报错是在win7上,装的是office2010,换了台win10,office2019再用navicat12导出就没问题了)

2.xlsx和xls使用vlookup函数后报错

因为excel使用vlookup后发现明明可以匹配的数据,但是就是显示匹配结果是#N/A,数据没问题,但是再空格上边有“绿色三角”。

EXCEL 导入MSSqlserver数据库报错_第1张图片

搜一搜后发现是数据异常的意思,也就因为文件格式有变动,所以出现这个问题。 解决的办法也很简单,就是选中所有绿色三角,然后点击提示的这个黄色小叹号。然后点击转换为数字,三角就没有了。之后vlookup函数也正常工作了!

EXCEL 导入MSSqlserver数据库报错_第2张图片

3.主键约束问题 

这个问题是通过excel导入的时候发现的,原来是设置了两个属性共同为主键,但是看数据是没问题的,两个属性按照逻辑来讲不会冲突。取消主键约束后(就是点击两个小钥匙就可以取消)数据不再报错。

4.xlsx格式中日期与数据库中datatime格式不符合 

取消主键后,结果发现导入的数据确实存在重复值!是日期格式的属性有重复值,都是1900年.....这样的,数据库里边是datatime,但excel表格里边是这样显示的。

EXCEL 导入MSSqlserver数据库报错_第3张图片

应该是数字格式没匹配上。 

EXCEL 导入MSSqlserver数据库报错_第4张图片

几番搜索后,得到解决办法,就是点击上图的“其他数字格式”,然后设置一下类型。

EXCEL 导入MSSqlserver数据库报错_第5张图片

 这样设置之后再导入就不再报错,并且数据库里边的数据是正常的datatime格式了!

 5.Sqlserver自增长列标识导入的时候报错【这个是最坑的一切的源头!

 之所以会出现这种需求,是因为我把数据库数据的导入导出来更新想象的太简单了,导出完excel格式数据后就很放心的清除数据库表的数据,可是没想到啊,再导入的时候就报错,发现是因为这个表里边存在“标识列”,就是自增长的一个列,不允许通过excel方式来往里边添加数据。

开始没有意识到标识列字段的重要性,所以强制通过excel导入了数据,就是在导入的时候将excel列与数据库属性的对应关系选择空,这样就可以导入了,不过导入的数据的标识列是自动往后边累加的

在发现表示列的数不一致的时候,会想有没有取消表示列的方法,搜到的方法是通过【增加同名列-复制数据-删标识列】的方法。但既然设置数据库的时候启用了表示列,那必然是有用的。所以pass掉这种方法。后来又发现可以通过充值增加种子的方法重新导入再增,也就是下边第一句SQL,这样就解决了部分问题,另外一部分问题分解成了上边的Q1~Q4也都解决了!

-- 重置表中的标识列的增加起点为1
-- 参数1是表名 参数2是执行类型 RESEED代表重置种子 参数3设置数值  
DBCC CHECKIDENT('USERINFO', RESEED,1) 

-- 清除表的内容 USERINFO 是表名
TRUNCATE TABLE [USERINFO] 

-- 设置手动插入标识列的值
-- ON 代表启动手动设置 不过这个对insert语句有效 excel测试无果
set identity_insert USERINFO ON 

小结

就以这次经历来讲最保险的数据导出是将这个表转存成sql文件,包括数据和表结构!

 当然更好的方式是对整个数据进行灾备和定期备份,这个我不太了解,经此一役后要多注意这方面知识的学习了!

你可能感兴趣的:(经验分享,数据库,database)