【发布时间】:2017-10-03 21:39:51
【问题描述】:
我有一个 SSIS 包,我在其中使用 ForEach 容器循环遍历文件夹目标并提取单个 .csv 文件。
容器获取它找到的文件并将文件名用于平面文件连接管理器的 ConnectionString。
在容器内,我有一个数据流任务将行数据从 .csv 文件(使用平面文件连接管理器)移动到 OLEDB 目标(它使用另一个 OLEDB 连接管理器)。
当我尝试执行此容器时,它可以抓取文件名,将其加载到平面文件连接管理器中,并开始传输行数据;但是,它在移动任何数据之前不断出错 - 即在两个问题上:
错误:0xC02020A1 将结算文件数据移入临时表,SettlementData_YYYYMM [1143]:数据转换失败。列“MONTHS_REMAIN”的数据转换返回状态值 2 和状态文本“由于可能丢失数据,无法转换该值。”。
错误:0xC02020A1 将结算文件数据移动到临时表,平面文件源 [665]:数据转换失败。列“CUST_NAME”的数据转换返回状态值 4 和状态文本“文本被截断或目标代码页中的一个或多个字符不匹配。”。
在我目前的研究中,我知道您可以设置什么条件来强制错误输出失败,并选择忽略连接管理器中截断的失败;然而,因为平面文件连接管理器的 ConnectionString 每次容器执行时都会重新创建,它似乎并没有保留那些选项设置。根据我的经验,当连接管理器为每列选择 OutputColumnWidth 时,它应该从数据集中选择最大值,所以我不太明白它是如何截断那里的名称(数据库设置为 VARCHAR(255 ) 所以那里有足够的空间)。
至于失败的数据转换,我也不明白当引用的列使用简单的 Int 值并且连接管理器和接收数据库都使用浮点数时会发生这种情况,这应该包含 Int 数据(我我不知道您不能将 Int 转换为 Float?)。
根据我的经验,某些 .csv 文件在直接进入数据库目标时无法在 SSIS 中正常播放;那么,将 .csv 转换为 .xlsx 文件会更好吗,这样进入数据库时效果会更好,或者我还缺少其他什么东西可以轻松地将大量数据从 .csv 文件移动到数据库中 -或者,我只是愚蠢,把一件小事变成了更大的事情吗?
注意:我在平面文件连接管理器中动态设置文件的原因是 .csv 文件将有一个集名称附加它作为重复过程的一部分生成的月/年,并且所以无论日期信息如何,我都会使用名称的常量部分来获取它
编辑: 这是我的平面文件连接管理器的屏幕截图,预览了它将尝试通过管道传输的一些数据。我注意到其中一些行在它们周围有引号,并想确保不会对任何事情产生不利影响 - 有问题的列是 MONTHS_REMAIN one
【问题讨论】:
-
即使底层连接发生变化,您为平面文件源组件定义的错误输出设置也应该保持不变。很少有 XLSX 文件使 SSIS 中的事情变得更容易。 XLSX 连接器通常guesses the datatype of Excel columns wrong。 Excel 文件带来了文件句柄的复杂性。如果其他人打开了 Excel 文件,而包正在尝试处理它,则包将失败。坚持使用 CSV。
标签: sql-server excel csv ssis