SQL Server BULK INSERT导入程序生成文件失败,疑为权限问题?
SQL Server BULK INSERT 导入失败排查指南
问题概述
在SQL Server中执行批量导入操作,使用以下BULK INSERT语句:
BULK INSERT cowords_batch_1 FROM 'E:\wikipedia\todb\batch1.txt' WITH (FIELDTERMINATOR='\t', ROWTERMINATOR='\n');
目标表cowords_batch_1结构:
[word_id] [int] NULL, [coword_id] [int] NULL, [total_proximity] [decimal](18, 9) NULL
导入文件batch1.txt内容:
2 224620 0.5 2 191679 0.2 2 185763 0.5 2 275974 0.33333334 2 263506 0.25
测试现象
- 手动用Notepad.exe创建的文件,导入成功;
- 程序生成的文件导入失败,报错:
Msg 4864, Level 16, State 1, Procedure dbo.upload, Line 3 [Batch Start Line 2] Bulk load data conversion error (type mismatch or invalid character for the specified codepage) for row 1, column 3 (total_proximity); - 将程序生成文件的内容复制到手动创建的文件中,导入成功;
- 将手动创建文件的内容复制到程序生成的文件中,导入失败;
- 向程序生成的文件手动输入数据,导入仍失败。
已排除项:
- 逐字节对比确认文件内容一致,包含字段间的ASCII 9(制表符)和行尾的ASCII 10(换行符);
- 已给文件目录
Everyone完全控制权限,文件所有者为Everyone,排除权限问题。
后续排查方向
- 文件编码与BOM检查:Notepad默认保存为UTF-8带BOM或ANSI编码,程序生成的文件可能是UTF-8无BOM、UTF-16或其他编码。用十六进制编辑器查看文件开头是否有字节序标记(BOM):UTF-8 BOM为
EF BB BF,UTF-16LE为FF FE。可尝试在BULK INSERT语句中添加CODEPAGE参数(如CODEPAGE='65001'对应UTF-8,CODEPAGE='1252'对应ANSI),或指定DATAFILETYPE='char'/'widechar'适配编码。 - 文件特殊属性与隐形数据流:检查程序生成的文件是否带有加密、压缩属性(右键→属性→高级),或存在交替数据流(ADS)。可通过命令行执行
dir /r查看文件是否关联了额外数据流。 - 换行符与隐形控制字符:再次用十六进制编辑器逐行校验,确认行尾无多余控制字符(如ASCII 13回车符、ASCII 0空字符),部分程序可能会写入混合换行符导致解析错误。
- 指定FORMATFILE明确列格式:创建格式文件,精确定义每列的数据类型、分隔符和长度,避免SQL Server自动解析时的格式误解。
- 文件句柄与缓存问题:程序生成文件后可能未正确释放文件句柄,导致SQL Server读取到缓存的不完整内容。生成文件后关闭程序,或重启SQL Server服务后再测试导入。
- 数据库排序规则匹配:检查目标数据库的排序规则是否与文件编码兼容,若数据库使用非Unicode排序规则(如
SQL_Latin1_General_CP1_CI_AS),需确保文件编码与排序规则的代码页一致。
内容的提问来源于stack exchange,提问作者Len White
相关产品推荐
相关产品推荐

