如何解决将CSV文件导入SQL Server时出现的错误
问题描述
将CSV数据导入SQL Server时,在第1828行触发截断错误,涉及start_station_name列,错误提示文本截断或字符与目标代码页不匹配。已尝试以下操作但未解决:
- 使用导入向导高级选项的「Suggest Type」按钮
- 将源数据类型从
string[DT_STR]改为文本流[DT_TEXT] - 将目标列
OutputColumn设置为VARCHAR(255)和VARCHAR(50)
错误信息
Error 0xc02020a1: 数据流任务1:数据转换失败。列"start_station_name"的数据转换返回状态值4,状态文本为"文本被截断,或者一个或多个字符在目标代码页中没有匹配项。"
(SQL Server 导入和导出向导)Error 0xc020902a: 数据流任务1:"源 - 2021_08_divvy_tripdata_csv.输出[平面文件源输出].列[start_station_name]"失败,原因是发生截断,并且该列的截断行处置设置为截断时失败。在指定组件的指定对象上发生了截断错误。
(SQL Server 导入和导出向导)Error 0xc0202092: 数据流任务1:处理文件"C:\Users\USER\Downloads\divvy_trips_data\2021_08_divvy_tripdata.csv"的第1828行时发生错误。
(SQL Server 导入和导出向导)Error 0xc0047038: 数据流任务1:SSIS错误代码DTS_E_PRIMEOUTPUTFAILED。"源 - 2021_08_divvy_tripdata_csv"上的PrimeOutput方法返回错误代码0xC0202092。当管道引擎调用PrimeOutput()时,组件返回了失败代码。失败代码的含义由组件定义,但错误是致命的,管道已停止执行。在此之前可能会发布更多有关失败的错误消息。
(SQL Server 导入和导出向导)
解决步骤
- 检查源数据实际长度:打开CSV文件定位到第1828行的
start_station_name列,查看该字段的实际字符长度。如果超过255,直接扩大目标列长度,比如设为VARCHAR(500)或NVARCHAR(MAX)(含特殊字符时优先选后者)。 - 统一代码页与字符类型:若CSV包含非ASCII字符,将源数据类型改为
string[DT_WSTR](Unicode字符串),目标列设为NVARCHAR类型,避免代码页不匹配导致的字符转换失败。 - 调整截断处置策略:在平面文件源的列属性中,将
start_station_name列的「截断行处置」临时改为「忽略失败」或「重定向行」,先跳过错误行完成导入,同时查看错误行内容确认问题根源。 - 同步源端列长度限制:在导入向导「高级」选项里,修改平面文件源中
start_station_name列的「输出列长度」至足够大(比如500),再匹配目标列长度,避免源端提前截断数据。 - 设置文本限定符:如果CSV字段包含逗号、换行符等特殊字符,在平面文件连接管理器中正确设置文本限定符(比如双引号
"),防止字段被错误拆分导致长度异常。
内容的提问来源于stack exchange,提问作者Kike

