Access 2016通过VBA/SQL导入CSV时RefID字段值丢失/截断问题
问题根因
Access的ACE/Jet文本驱动读取CSV时默认扫描前8~24行自动推断字段类型,你的REFID字段前几行大概率为纯数值格式,驱动因此将该字段识别为双精度数值型:非数值格式的REFID会被判定为无效值返回空,带前导零、后缀星号的数值类REFID也会按照数值规则截断、丢失原始格式。
解决方案
方案1:使用Schema.ini强制指定字段类型(最稳定,无副作用)
该方案是微软官方推荐的文本数据源类型指定方案,操作如下:
- 进入CSV存放目录
V:\Accounting Process Support\Projects\In Work,新建名为Schema.ini的纯文本文件 - 在文件中写入以下配置:
[Mon Coll Rpt 09072021.csv] ColNameHeader=True Format=CSVDelimited Col4=REFID Text Width 255
说明:Col4对应REFID为查询字段中的第4位,若你的CSV字段顺序有调整可自行修改序号,也可补充所有字段的类型定义,避免其他字段也出现类型推断异常
- 无需修改原有导入代码,直接执行SQL即可,驱动会自动读取Schema.ini配置,将REFID按文本格式完整导入。
方案2:修改SQL强制转换字段为文本
如果不方便在CSV目录新增文件,可以修改SELECT语句中REFID的取值逻辑,强制驱动按文本处理:
将SELECT段的[REFID]替换为'' & [REFID] AS [REFID],修改后的代码示例:
vSQL = "INSERT INTO [tbl_Stage] ([BATID], [AGNCY_NAM], [CNTRCTNBR], [REFID], [ISSDTE], [ISSUETIME], [VIOLT_CDE], [VIOLT_TYPE], [CTTNAMT], [ERACADMFEE], [RENTINGGPBR]) " & _ "SELECT [BATID], [AGNCY_NAM], [CNTRCTNBR], '' & [REFID] AS [REFID], [ISSDTE], [ISSUETIME], [VIOLT_CDE], [VIOLT_TYPE], [CTTNAMT], [ERACADMFEE], [RENTINGGPBR] " & _ "FROM [text;HDR=Yes;FMT=Delimited(,);Database=V:\Accounting Process Support\Projects\In Work].[Mon Coll Rpt 09072021.csv]" db.Execute vSQL, dbFailOnError
注意:该方案存在局限性,如果CSV前8行REFID全为纯数值,仍可能出现非数值内容识别为空的问题,优先选择方案1。
内容的提问来源于stack exchange,提问作者Shaves
相关产品推荐
相关产品推荐

