You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

将大型城市文本文件导入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

火山引擎 最新活动