【问题标题】:Piping Data from CSV File to OLEDB Destination in SSIS在 SSIS 中将数据从 CSV 文件管道传输到 OLEDB 目标
【发布时间】: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


【解决方案1】:

您正在处理的套件中的某个 csv 文件是否可能格式错误?例如,如果其中一个文件有一个额外的列/逗号,那么这可能会强制将 varchar 列转换为整数列,从而产生类似于您所描述的错误。您是否尝试过使用错误行重定向来确认您的所有 csv 文件格式正确?

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

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

【讨论】:

  • 按照您在此处演示的操作,每行都会出错到数据查看器路径,并显示消息“由于符号不匹配或数据溢出以外的原因,无法转换数据值。”似乎有问题的列包含负整数和正整数,在我的平面文件连接管理器中,我将 DataType 设置为 DT_I4,并将接收 OLEDB 目标设置为整数。对于这种类型的数据,这似乎不正确吗?
  • 如果每一行都出错,那么我们就有一个根本问题。听起来 SettlementData_YYYYMM 连接的列的数据类型定义错误。从您的图像中,"MONTHS_REMAIN" 列包含 -54.00"194" 的值。 "194" 不是 DT_I4 数据类型。这些是 DT_WSTR 列。复制现有的连接管理器并将所有列重新定义为 DT_WSTR 列,然后重试。一旦源代码正常工作,然后将这些列从 DT_WSTR 转换为 DT_I4。添加派生列组件以替换为双引号并转换
  • 示例派生列转换代码以去除引号并转换为 DT_I4。 (DT_I4)REPLACE([MyColumn], "\"", "")。您需要在所有列上执行此操作。
  • 所以我能够获取文件中的所有列(我见过的最糟糕的数据集)并将它们转换为 DT_WSTR,然后作为 nvarchar 进入数据库,它现在可以工作了。不是一个完美的解决方案,但它是使用这种不负责任的文件数据集可以实现的最佳解决方案
  • 很高兴听到。最后一个问题。如果您在记事本中打开文件,请暂时忽略预览器。每个值都用双引号括起来吗?如果是这样,那很好。你所拥有的是一个文本限定文件。在平面文件源连接管理器中设置 Text Qualifier 选项。选择双引号字符。这将为您去除这些引号,您甚至可以将它们直接通过管道传输到使用整数数据类型等的原始表中。有关更多信息,请参阅here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多