将CSV文件中的数据configuration到SSIS中的OLEDB目的地

我有一个SSIS包,其中我使用ForEach容器来循环访问一个文件夹的目标,并拉一个.csv文件。

图1

Container接受find的文件,并使用Flat File Connection Manager的ConnectionString的文件名。

在容器中,我有一个数据stream任务将行数据从.csv文件(使用平面文件连接pipe理器)移动到OLEDB目的地(这有另一个它使用的OLEDB连接pipe理器)。

图2

当我尝试执行这个容器时,它可以获取文件名,将其加载到平面文件连接pipe理器中,并开始传输行数据; 然而,在移动任何数据之前,它会不断地错误 – 即超过两个问题:

错误:0xC02020A1将结算文件数据移入临时表,SettlementData_YYYYMM [1143]:数据转换失败。 “MONTHS_REMAIN”列的数据转换返回状态值2,状态文本“由于数据可能丢失而无法转换该值”。

错误:0xC02020A1将结算文件数据移入临时表,平面文件源[665]:数据转换失败。 “”CUST_NAME“”列的数据转换返回了状态值4,并且状态文本“Text被截断,或者一个或多个字符在目标代码页中没有匹配”。

在我到目前为止的研究中,我知道你可以设置什么条件来强制错误输出失败,并select忽略连接pipe理器中的截断失败; 但是,因为每次执行容器时都会重新创buildFlat File Connection Manager的ConnectionString,所以似乎没有保留这些选项设置。 同样,根据我的经验,当连接pipe理器为每列selectOutputColumnWidth时,应该从数据集中选取最大的值,所以我不太明白它是如何在那里截断名称的(数据库设置为VARCHAR(255 )所以有足够的空间)。

至于失败的数据转换,我也不明白当引用的列是使用简单的Int值时会发生什么,连接pipe理器和接收数据库都使用浮点数,应该包含Int数据(我不知道你不能将Int转换成Float?)。

直接进入数据库目标时,一些.csv文件在SSIS中播放不好,这是我的经验。 所以,将.csv转换成一个.xlsx文件会更好,这个文件可以在数据库中播放得更好,或者还有其他一些东西可以轻松将大量数据从.csv文件移动到数据库中 – 或者,我只是愚蠢而把一件小事变成了比它更大的东西?

注意:我在Flat File Connection Manager中dynamic设置文件的原因是.csv文件会附加一个设置名称,并将其作为重复过程的一部分生成的月份/年份,所以我使用常量部分的名称来抓它,不pipedate信息

编辑:这是我的平面文件连接pipe理器的屏幕上限预览一些数据,它将尝试通过。 我注意到其中的一些行在他们周围有引号,并且要确保不会有任何不利影响 – 具有问题的列是MONTHS_REMAIN之一 在这里输入图像说明

你正在处理的套件中的一个csv文件是否可能格式错误? 例如,如果其中一个文件有一个额外的列/逗号,那么可能会强制将一个varchar列变成一个整数列,从而产生类似于您所描述的错误。 你有没有尝试使用错误行redirect来确认所有的CSV文件形成正确?

要使用错误行redirect,请更新您的Flat File Source并调整Error Output设置以redirect行。 您的平面文件源组件现在将有一个额外的红色箭头,您可以连接到目标。 将红色箭头从源组件拖动到新的条件分割。 接下来,右键单击红线并添加数据查看器。 现在,当处理错误行时,它们将通过红线stream入数据查看器,以便您可以检查它们。 最后,执行包并等待数据查看器捕获错误的行以供检查。

在这里输入图像说明

数据查看器捕获的数据值是否正确? 祝你好运!