在SSIS中导入制表符分隔文件,其中一个字段大于255个字符

时间:2012-01-13 14:18:45

标签: sql-server-2008 ssis

我正在导入制表符分隔文件并收到此错误。

  

错误:任务3处的0xC02020A1 - 核心数据,平面文件的数据加载   来源[14]:数据转换失败。列的数据转换   “列85”返回状态值4和状态文本“文本是   截断的或一个或多个字符在目标代码中不匹配   页“。

     

错误:任务3处的0xC020902A - 核心数据,平面文件的数据加载   来源[14]:“输出栏”栏目85“(448)”失败,因为   发生截断,截断行处理“输出   列“列85”(448)“指定截断失败   指定的指定对象上发生截断错误   零件。错误:任务3处的0xC0202092 - 核心数据的数据加载,平坦   文件源[14]:处理文件时发生错误   数据行540上的“C:\ Metrics \ report-quoteCoreData.csv”。错误:   任务3的0xC0047038 - 报价核心数据的数据加载,SSIS.Pipeline:   SSIS错误代码DTS_E_PRIMEOUTPUTFAILED。 PrimeOutput方法   组件“Flat File Source”(14)返回错误代码0xC0202092。该   当管道引擎调用时,组件返回失败代码   PrimeOutput()。失败代码的含义由   组件,但错误是致命的,管道停止执行。   在此之前发布的错误消息可能包含更多

当我在其中一个字段上设置截断错误时忽略它似乎导入。

不幸的是我得到了

Column A ( customer ) Column B ( Location ) Column C ( should be Y or N )
Jimmy                        New York               ssssss  ( instead of Y ) 

在这一行上,我有一个超过255个字符的早期字段,导致SSIS中出现ERROR。如果我告诉它忽略错误,我会为该行插入错误的数据。 “Ssss ....”是超过255个字符的字段。

这里有什么解决方案?

2 个答案:

答案 0 :(得分:6)

在平面文件连接管理器中,您需要调整每列不足以容纳传入值的OutputColumnWidth属性。在您的示例中,Column 85当前定义为255个字符,因此将其提升到合理的值。目标是使该值足够大以覆盖传入的数据,但不要太大以至于浪费内存空间。

更改Connection Manager后,任何使用相同CM的数据流都会报告列定义已更改,您需要进入它们,双击并让新的元数据逐渐减少。

enter image description here

我已经看到在某些类型的转换之后元数据不会自动刷新的情况(Union All我正在看着你)。作为完整性检查,双击目标之前的连接器(可能是OLE DB目标)。单击“元数据”选项卡,确保Column 85为500或您指定的任何值。如果不是,那么你得到以回到链条的方式来找出它所处的位置。最简单的解决方法通常是删除令人不安的转换并重新添加。

enter image description here

答案 1 :(得分:0)

我在导入包含超过255个字符的字段的CSV文件时遇到了这个问题,我使用python解决了该问题。

只需将CSV导入大熊猫数据框中,然后计算每行中每个字符串值的长度

然后按降序对数据框进行排序。这将使SSIS可以在扫描前3行以分配存储空间时为其分配最大空间

df = pd.read_csv(f,sheet_name=0,skiprows = 1)
df = df.drop(df.columns[[0]], axis = 1)
df['length'] = df['Item Description'].str.len()
df.sort_values('length', ascending=False, inplace=True)
writer = ExcelWriter('Clean/Cleaned_'+f[5:])
df.to_excel(writer,sheet_name='Billing',index=False)
writer.save()