SSIS 无法获取列值并将其设置为 NULL

Posted

技术标签:

【中文标题】SSIS 无法获取列值并将其设置为 NULL【英文标题】:SSIS failing to get column value and setting it to NULL 【发布时间】:2016-03-08 17:03:52 【问题描述】:

我有一个 SSIS 包,它从 Oracle 表中读取数据并将其放入 Netezza 表中。由于某种原因,SSIS 无法读取特定列值(2% 的记录),如此处的屏幕截图所示。

Oracle 中的列类型是 NUMBER(3),而在我的 Netezza 表中,它是 SMALLINT。知道为什么会发生这种情况吗?

错误栏也不给我任何信息。

到目前为止我所尝试的:

    尝试使用此MSDN article 获得更好的错误描述。 将批量大小从默认的 1000 减少到 100。

提前感谢您的帮助。

编辑

我让它失败了,这是我收到的错误消息。我的笔记本电脑上有 4 GB 内存。这可能是个问题吗?

[DESTINATION_TABLE 2] 错误:出现打开数据库连接 (ODBC) 错误。 SQLExecute 在插入第 35244 行时返回错误

[DESTINATION_TABLE 2] 错误:出现打开数据库连接 (ODBC) 错误。状态:'HY008'。本机错误代码:51。操作已取消

[DESTINATION_TABLE 2] 错误:出现打开数据库连接 (ODBC) 错误。状态:'01000'。本机错误代码:1.无法写入nzlog/bad文件

[DESTINATION_TABLE 2] 错误:出现打开数据库连接 (ODBC) 错误。状态:'01000'。本机错误代码:1.无法写入nzlog/bad文件

[DESTINATION_TABLE 2] 错误:出现打开数据库连接 (ODBC) 错误。状态:'HY000'。本机错误代码:46。错误:外部表:错误输入行数达到最大错误限制

[SSIS.Pipeline] 错误:SSIS 错误代码 DTS_E_PROCESSINPUTFAILED。处理输入“ODBC 目标输入”(13) 时,组件“DESTINATION_TABLE”(2) 上的 ProcessInput 方法失败,错误代码为 0x80004005。已识别的组件从 ProcessInput 方法返回错误。该错误是特定于组件的,但该错误是致命的,将导致数据流任务停止运行。在此之前可能会发布错误消息,其中包含有关失败的更多信息。

[SOURCE_TABLE [63]] 错误:无法将行添加到输出缓冲区

[SOURCE_TABLE [63]] 错误:出现打开数据库连接 (ODBC) 错误。

[SSIS.Pipeline] 错误:SSIS 错误代码 DTS_E_PRIMEOUTPUTFAILED。 SOURCE_TABLE 上的 PrimeOutput 方法返回错误代码 0x80004005。当管道引擎调用 PrimeOutput() 时,组件返回了失败代码。失败代码的含义由组件定义,但是错误是致命的并且管道停止执行。在此之前可能会发布错误消息,其中包含有关失败的更多信息。

【问题讨论】:

您是否尝试过仅从 oracle 提取到平面文件而不使用 NZ(用于故障排除)。需要弄清楚是导致问题的提取物还是负载... 您应该尝试设置 Netezza 目标的日志目录属性。您至少可以看到 nzlog/nzbad 输出文件,以便从目的地获得更多信息。 @NWest - 这是一个很棒的建议。我这样做了,还必须使用 MaxBufferSize 属性并将提交大小从 1000 更改为 500。它工作但需要 2 小时(停机时),但加载 646 MB 数据需要 2 小时。解决这个奇怪问题的方法是使用 Netezza 的 OLEDB 驱动程序并按照 Mehtat_90 所说的进行操作。 【参考方案1】:

您是否尝试过在数据流中进行数据转换?尝试在 SSIS 中将数字转换为 (DT_I2),然后我相信它会起作用

【讨论】:

这解决了部分问题。为什么 96% 的行没有这个奇怪的问题仍然是个谜。一劳永逸地解决了我的问题是像您所说的那样将 DT_12 用于该字段,并将 OleDB 驱动程序用于 Netezza。我能够使用 Oracle->Flat File->Netezza(仍在使用 ODBC)获得 100% 的行,但需要 2 小时才能加载 646 MB 的数据。使用 OleDB,即使在白天也只需不到 2 分钟。 我相信这个问题可以通过将 AccessMode 属性设置为使用 FastLoad 的 OpenRowset 或使用变量中的 FastLoad 的 OpenRowset 来解决。

以上是关于SSIS 无法获取列值并将其设置为 NULL的主要内容,如果未能解决你的问题,请参考以下文章

pandas取列值转化为列表

PLSQL 检查列值并将其替换为空白

如何从 PySpark Dataframe 中删除重复项并将剩余列值更改为 null

将列值显式设置为null SQL Developer

插入表格并将另一列设置为自动递增的列值

判断:ORACLE中,用==NULL来判断列值是不是为空,