当前位置: 代码迷 >> Sql Server >> excel 过百万导入解决办法
  详细解决方案

excel 过百万导入解决办法

热度:73   发布时间:2016-04-24 18:34:51.0
excel 过百万导入
过百万数据Excel  客户端导入
需求:1.导入的每条数据,都要验证比较
       验证的内容(确定数据库是否存在相同的A字段,存在则补全信息,不存在则插入,
       插入的时候要生成一个唯一的ID,格式为年份+区号+数据库这个区号的最大ID数 
       例如最大ID数为2014 01 00001 那下一个插入的为2014 01 00002 )


急用 谢谢
------解决方案--------------------
一、如果电脑装的是2007的话,升级到2010,不要嫌升级麻烦。
这个是经验之谈,我经常需要用excel处理大量数据,2007在效率上比2010差很多。

二、先用excel处理好你的数据。
重复、补缺、条件筛选、排序方式等等。
从你说的来看,较麻烦的是补缺。以电话号码补缺为例,在一个文件中建立多个表进行处理。
1、母表01,保留名字、身份证号等信息
2、确定电话号码最多会有几个,假设为2个。
3、建立子表02,保留身份证号和第1列的电话号码
4、建立子表03,保留身份证号和第2列的电话号码
5、在母表01,搜索子表02中的电话号码,填入列。同样搜索子表03电话号码,填入另外一列。具体函数用index
6、其他的筛选什么的自己做吧。

三、处理序号
你说的意思不太明确,不知道你具体怎么定义。
解决思路就是在excel中处理好以后再导入数据库
------解决方案--------------------
用openrowset的 bulk insert ,应该是比较快的
------解决方案--------------------

把csv文件中的数据导入SQL Server的方法
http://blog.csdn.net/sqlserverdiscovery/article/details/12580553
------解决方案--------------------
代码适当改一下:
--修改高级参数
sp_configure 'show advanced options',1
go

--允许即席分布式查询
sp_configure 'Ad Hoc Distributed Queries',1
go

--如果配置的值不在合理范围(在最小值最大值范围内),那么可以强制覆盖
reconfigure with override  
go

sp_configure 'xp_cmdshell',1
go
reconfigure
go


--创建数据库
create database wc 
go


use wc
go

--建表
create table xxdd
(
aa nvarchar(1000),
bb nvarchar(1000),
cc nvarchar(1000),
dd nvarchar(1000),
ee nvarchar(1000),
ff nvarchar(1000)
)
go


/* 这里建立一个c:\wc.csv  文件,内容如下:
aa,bb,cc,dd,ee,ff
42222222223432432432,32432432432432432432,2332432432,32432432432,32432432,23432432
42222222223432432432,32432432432432432432,2332432432,32432432432,32432432,23432432
42222222223432432432,32432432432432432432,2332432432,32432432432,32432432,23432432
42222222223432432432,32432432432432432432,2332432432,32432432432,32432432,23432432

*/

--导出格式文件,这个是关键,数据库名称,表名称,用户名和密码,服务器ip和端口
--都改成你自己的
exec xp_cmdshell 'bcp wc.dbo.xxdd format nul -t "," -f c:\wc.fmt -c -Usa -Pyupeigu -S 192.168.1.106,1433'
go


--先查看要导入的数据
select *
from 
openrowset(bulk 'c:\wc.csv',             --要读取的文件路径和名称 
                formatfile='c:\wc.fmt',  --格式化文件的路径和名称
                
                firstrow = 2,            --要载入的第一行,由于第一行是标题,所以从2开始
                --lastrow  = 1000,       --要载入的最后一行,此值必须大于firstrow
                
                maxerrors = 10,          --在加载失败之前加载操作中最大的错误数
                --errorfile ='c:\wc_error1.txt', --存放错误的文件
                
                rows_per_batch = 10000                    --每个批处理导入的行数
          ) as t 

/*
aa bb cc dd ee ff
42222222223432432432 32432432432432432432 2332432432 32432432432 32432432 23432432
42222222223432432432 32432432432432432432 2332432432 32432432432 32432432 23432432
42222222223432432432 32432432432432432432 2332432432 32432432432 32432432 23432432
42222222223432432432 32432432432432432432 2332432432 32432432432 32432432 23432432
*/

--最后可以 insert into 表 (列)  select * from openrowset...插入数据即可
insert into xxdd (aa,bb,cc,dd,ee,ff)
select *
from 
openrowset(bulk 'c:\wc.csv',             --要读取的文件路径和名称 
                formatfile='c:\wc.fmt',  --格式化文件的路径和名称
                
                firstrow = 2,            --要载入的第一行,由于第一行是标题,所以从2开始
                --lastrow  = 1000,       --要载入的最后一行,此值必须大于firstrow
                
  相关解决方案