【问题标题】:SSIS - I want the package to fail if there is error in Data Conversion transformationSSIS - 如果数据转换转换出现错误,我希望包失败
【发布时间】:2016-07-27 11:37:46
【问题描述】:

我正在读取 CSV 文件并将数据导入数据库。在我的 csv 文件中有一个 ID 字段,它最初是字符串。使用数据转换转换,我将 ID 字段的数据类型更改为 Int。

如果 ID 在至少一行中不是整数,我希望整个包失败并且它不应该处理任何记录。

数据转换我已经为 ID 字段设置了失败组件,但它仍然通过了其余具有有效 ID 的记录。

如果任何 ID 无效,我希望整个包失败,请问我该如何实现?

例子:

输入

ID | value
1  | apple
2  | Orange
3  | Kiwi
a4 | Black
a5 | Blue

由于ID的a4和a5不能通过Data转换转换为Int, 它不应该处理任何记录。但在 DB 表中我得到 1,2,3。

【问题讨论】:

    标签: sql-server csv ssis data-conversion ssis-2012


    【解决方案1】:

    观察到的 SSIS 行为是正常的,请在下面找到解释。 SSIS 分批读取和转换数据,也分批将数据写入目的地。因此,如果您的包很好地处理了 3 个第一条记录,然后发现错误,则包将停止,但插入的行将保留。
    你能做些什么呢?答案很简单——使用交易!在数据流任务上设置 transactionlevel=required(如果您的所有数据操作都在那里),或者使用 MS SQL 事务。一旦错误被触发 - 事务将被回滚,您将摆脱错误的行。前一种方法在 SSIS 和目标 MS SQL 服务器上都需要 MSDTC,并且与第二种方法相比可能会更慢。如果您需要在同一个事务中包含多个任务 - 您需要将它们放入一个 Sequence 并在 Sequence 上设置 TransactionLevel
    使用 MS SQL 事务的第二种方法需要更复杂的任务流 - 有条件地提交或回滚事务,在 MS SQL 目标连接管理器 (see example with screenshots) 上设置 RetainSameConnection=true 等。

    【讨论】:

    • 您好,对于延迟响应深表歉意,在我的数据流任务中,我正在对插入和更新记录使用查找转换。更新记录来自查找的匹配输出。如果我在我的数据流任务上设置 transactionLevel = required(我已经尝试过),查找转换也会失败,这不是理想的。我可以使用脚本任务循环遍历 ID 字段并且仅在 ID 都有效的情况下发送整个数据集吗?
    • @Rao,你可以做得更好。创建一个缓冲表,仅存储具有事务处理的有效记录,然后 - 通过查找等从中读取。
    【解决方案2】:

    您是否考虑过将整个内容读入某种临时表并检查内容?

    create table test
    (
        id varchar(5),
        c1 varchar(500)
    )
    
    insert into test values (1, 'apple')
    insert into test values (2, 'orange') 
    insert into test values (3, 'kiwi')
    insert into test values ('a4', 'black')
    insert into test values ('a5', 'blue')
    
    if (select COUNT(*) from test where ISNUMERIC(id) = 0) > 0
    begin
        select 'bad values and let ssis package know'
    end
    

    【讨论】:

    • 我认为可以在 SSIS 包本身中执行此操作,而无需将其写入临时表。
    • 你可以 - 看看我的回答。
    【解决方案3】:

    您想将不良记录引导至另一条路径。然后,您可以(就像许多开发人员所做的那样)保存错误记录并稍后解决它们并继续处理有效数据。

    当然,您可以将转换中的错误设置为失败,而不是重定向错误的行。在转换任务中单击“配置错误输出”(在左下角),您可以决定是要忽略、失败组件还是在出现错误时重定向。

    【讨论】:

    • 如果有一条记录的 ID 字段无效,我不想传递任何记录
    • 我已经尝试过问题中提到的失败组件。它通过对 ID 有效的 int 记录,而对于无效 ID 则失败。但如果 ID 无效,我不想传递任何记录。
    【解决方案4】:

    在数据流之前添加一个额外的数据流(temp),在temp中,将你的csv加载到一个临时表(临时表与你的真实表具有相同的结构),将这个新的数据流连接到你的数据流,连接条件成功,表示加载临时表必须成功才能继续加载真实表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-17
      • 2017-05-08
      相关资源
      最近更新 更多