0

我有一个ssis包含 3 个ssis包的项目,一个是父包,它根据某些条件调用其他 2 个包。在父包中,我有一个 foreach 循环容器,它将.csv从一个位置读取多个文件,并根据文件名执行两个子包之一,并将数据上传到 MS SQL Server 2008 中存在的表中。由于多个文件被读取,如果任何文件在子包中产生错误,我必须在自定义数据库表中记录错误的详细信息(如文件名、错误消息、行号等),删除所有得到的记录上传到表中并读取下一个文件,对于有效且读取时不会产生任何错误的文件,包不应停止。

假设一个文件有 100 行并且第 50 行有问题,那么我们需要将错误详细信息记录在一个表中,删除上传到数据库表中的第 1 到 49 行,并开始执行下一个文件的包.

如何在 SSIS 中实现这一点?

4

4 回答 4

1

您必须在 foreach 循环容器上设置TransactionOption =* Required * 并在其中的控制流项上设置TransactionOption =* Supported *。如果您的子包中发生任何并发症,这将允许您的事务回滚。有关“TransactionOption”属性的更多信息,请参见@http: //msdn.microsoft.com/en-us/library/ms137690.aspx

通过将目标的错误输出重定向到首选错误目标,可以在子包中执行自定义日志记录。但是,此重定向日志记录仅在插入错误时发生。因此,如果您希望捕获子包中任何地方发生的错误,则必须设置一个“OnError”事件处理程序或利用 SSIS 的内置错误日志记录(SSIS -> Logging..)

于 2013-07-19T14:16:30.130 回答
1

让我们分解一下。

我假设您有一个一次处理单个文件的数据流。数据流将通过源连接读取输入文件,对其进行转换,然后将数据加载到目标。您基本上需要通过选择“重定向行”在转换中实现错误处理程序流。此处提供有关错误流的详细信息:https ://docs.microsoft.com/en-us/sql/integration-services/data-flow/error-handling-in-data 。

如果由于格式错误而需要跳过整个文件,则需要为文件系统任务的失败实施优先约束。

我的建议是获取一份 70-463 考试准备书的副本——它有很好的练习示例,可以准确地说明您遇到的那种场景。

于 2017-08-26T05:34:11.780 回答
1

我建议您尝试在循环容器中创建两个数据流。这里的主要思想是拥有一组三个表,以更好、更轻松地处理错误情况。在同一流程中,您执行以下操作:

第一个数据流:应该读取 .csv 文件并将数据加载到临时表中。如果文件处理错误,您只需截断临时表。此外,您还应该配置平面文件源输出以将错误重定向到错误日志表。

第二个数据流:另一方面,在处理无错误的情况下,您需要将行从 temp 传输到目标表。因此,这里的 OLEDB 数据源是“临时表”,而 OLEDB 目标是“最终表”。

不要忘记在这两种情况下截断临时表,因为下一个文件需要一个空表。

于 2015-09-27T16:55:02.590 回答
0

我们对 Excel 文件做类似的事情 我们有一个 ErrorsFound 变量,每次在 for each 循环中读取一个新文件时都会重置该变量。脚本组件验证数据的每一行,如果发现错误,则将 ErrorsFound 变量设置为 true,并构建一个包含任何错误详细信息的字符串。然后 - 基于 ErrorsFound 变量 - 要么导入数据,要么将错误记录在日志表中。

当 Excel 文件填写得非常糟糕以至于进程根本无法读取它们时,它会变得有点棘手 - 例如,当在日期、数字或货币字段中输入文本时。在这种情况下,我们使用数据流任务的 OnError 事件处理程序在日志中记录错误,但不知道是哪一行导致了问题

于 2017-04-20T15:56:15.350 回答