将大型城市文本文件导入SQL Server 2012时遇数据转换错误求助
解决SQL Server导入导出向导中City列数据转换失败(错误0xc02020a1)的问题
这个错误核心就两个方向:文本长度不够导致截断,或者字符编码/代码页不匹配,针对你这个1.45GB的大文件,咱们一步步来解决:
一、优先排查文本截断问题
这是最常见的诱因,导入向导默认的列长度往往没法覆盖所有城市名称:
- 走到导入导出向导的**「选择源表和源视图」步骤时,点右下角的「编辑映射」**按钮
- 在映射窗口找到
City列,检查目标列的配置:- 如果目标列是
varchar类型,直接改成varchar(MAX)(或者根据实际数据预估一个足够大的长度,比如varchar(255)不够就再加) - 如果文件里包含非英文字符(比如带重音的欧洲城市名、中文城市名),直接用
nvarchar(MAX)更稳妥,还能顺带解决部分编码问题
- 如果目标列是
- 保存设置后重新运行导入任务
二、处理字符编码/代码页不匹配问题
要是调整长度后还是报错,那大概率是源文件和数据库的编码不兼容:
- 回到**「选择数据源」步骤,找到「代码页」**选项:
- 先确认文本文件的编码:用记事本打开文件,点「文件」→「另存为」,看右下角的编码(比如UTF-8、ANSI、Unicode)
- 如果是UTF-8编码,向导里把代码页设为
65001;如果是ANSI,选对应系统的代码页(比如中文系统是936) - 同时确保目标表的
City列是nvarchar类型,向导的映射里要把源列类型对应到nvarchar,别选varchar
- 对于超大文件,用
BULK INSERT命令替代向导会更高效灵活,给你个示例代码:
BULK INSERT dbo.worldcitiespop FROM '你的文件完整路径\worldcitiespop.txt' WITH ( FIELDTERMINATOR = ',', -- 替换成你实际的字段分隔符,比如制表符就用'\t' ROWTERMINATOR = '\n', -- 行分隔符,根据文件实际情况调整 CODEPAGE = '65001', -- 对应UTF-8编码,按需修改 MAXERRORS = 10, -- 允许少量错误,方便排查问题 FIRSTROW = 2 -- 如果文件有表头,从第2行开始导入 );
注意:执行这个命令需要SQL Server服务账户能访问文件路径,嫌麻烦的话可以把文件放到SQL Server的默认数据目录下。
三、额外排查小技巧
- 先截取文件前100行单独导入,测试是否能成功,快速定位是全文件的问题还是某几行的特殊字符导致的
- 如果是个别行有特殊字符报错,可以在向导的**「数据转换」**步骤里临时勾选「忽略错误」,但更建议用
nvarchar类型兼容特殊字符,或者提前清理文件里的异常字符
内容的提问来源于stack exchange,提问作者Daina Hodges




