bulk insert 关于FirstRow作用不可靠的问题

本文探讨了使用 BULK INSERT 在 SQL Server 中批量导入大型文件的方法,并详细分析了 FieldTerminator 和 RowTerminator 的作用机制。此外还介绍了如何通过 FORMATFILE 调整字段映射,以及 OPENROWSET 的应用场景。

代码: 
BULK  INSERT  inssum
FROM  'logFile', 
WITH  ( 
      CODEPAGE  =  'RAW', 
      FIRSTROW  =  2, 
      LASTROW    =  4, 
      MAXERRORS  =  2, 
      DataFileType='char', 
      FieldTerminator='|', 
      RowTerminator='|/r/n', 
      BATCHSIZE=  1, 
      TABLOCK 
      ) 
   
  数据(1):
  H|515800Rcords| 
  B|000000001|001|90101000|1|162926.81|0.00|0|0|0| 
  B|000000002|001|90101000|1|162926.81|0.00|0|0|0| 
  B|000000003|001|90102000|1|18200.00|0.00|0|0|0| 
  B|000000004|001|90201000|1|0.00|0.00|0|0|0| 
  B|000000005|001|90101000|1|162926.81|0.00|0|0|0| 
  ....
   
  入库数据(1) 
  B  000000002  ... 
  B  000000003  ... 
  B  000000004  ... 

  入库数据(希望得到的结果) 
  B  000000001  ... 
  B  000000002  ... 
  B  000000003  ... 

如果不打算忽略掉首行, 有没有很好的办法,包括先对源文件进行预处理,但要求效率很高,
因为记录数量是千万级的。

 

 


1)bulk insert导入大文件,受到内存的限制,
测试足够的不同大小的文件,
一直读到内存不够,
加上内存又可以继续,
而其间,除个加时点CPU很高,
大部分情况下,cpu并不高,
而内存是不断平稳上升。

2)读入“行”、“列”的机制:(也是针对本问题最重要的一点)
涉及:FieldTerminator,RowTerminator,目标表的记录数!!
把Field、Row看成同一种情况,
而把“行”看成一种普通的分隔,问题就非常容易理解了,
bulk insert的机制是先“极大满足当前”的“行”或“字段”,
而且是遂个地按照顺序地进行分解:
FieldTerminator,FieldTerminator,共n个...,RowTerminator
周而复始。
推荐一个测试方法,把目标表的最后一个字段定义为超长,
然后缩减某些行的字段数,可以发现,总是会影响到二行(或多行并一行)。
结论是:
当列数大于目标表字段数,剩于字段并入最后字段(如最后字段不够在会出错)
当列数等于目标表字段数,正常
当列数小于目标表字段数,最近几行字段数加总正好小于目标表字段数的行并为同一行。


3)OPENROWSET的作用:
解决临时性一次读入非本地数据来源。

4)FORMATFILE   
能调整字段的对应

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值