选择在SSIS错误记录任务期间写入哪些行

问题描述 投票:2回答:3

如果我尝试使用SSIS将两个不同的行插入到具有主键的表中,如何确定将哪个行写入表以及哪个行由错误记录任务处理?

例如,我有一个目标表,其中包含两列和一个主键约束,我试图从源表中插入两行具有相同值但没有主键约束的行。

(KeyColumn UNIQUEIDENTIFIER NOT NULL, TextColumn VARCHAR(50) NULL)

如果我有两行具有相同的主键,尝试插入两个将导致SSIS包崩溃,但如果我添加错误记录以记录重复行,我有1/2的机会记录不正确的记录

| KeyColumn  |   TextColumn  |
|     1      | 'ValidRecord' |
|     1      |'InvalidRecord'|
|     2      | 'ValidRecord' |

如果我可以一致地确定有效记录(例如:TextColumn永远不应该包含文本'Invalid')如何创建SSIS任务以始终将正确的记录写入我的SSIS表并将错误的记录发送到日志记录任务?

sql-server ssis etl sql-server-data-tools error-logging
3个回答
1
投票

您可以使用两种方法实现此目的:

(1) Using a Script Component

如果需要根据键列检查重复项(第一次出现是有效的,则其他项无效),您可以使用脚本组件来实现。

  1. 首先,添加DT_BOOL类型的1输出列(示例名称:Flag)
  2. 在脚本内部使用类似的脚本: using System.Collections.Generic; public class ScriptMain: UserComponent { List<string> lstKey = new List<string>; public override void Input0_ProcessInputRow(InputBuffer0 Row) { if(!lstKey.Contains(Row.KeyColumn.ToString()){ lstKey.Add(Row.KeyColumn.ToString()); Row.Flag = true; }else{ Row.Flag = false; } } }
  3. 使用类似的表达式,基于Flag列值添加条件拆分以拆分行: [Flag] == True
  4. True路径映射到目标表,将False路径映射到错误记录目标

(2) Using a conditional split

如果您可以根据文本列检查orw是否有效,则可以使用以下表达式添加条件拆分:

FINDSTRING([TextColumn],'InvalidRecord',1) == True

0
投票

在OLEDb目标编辑器中,每批次设置行,您可以在那里输入1。然后,当SSIS失败时,您将获得失败的记录。

在类似的说明中 - 在您提供的表中,键列不能具有两个具有相同值1的行。您应该能够在登台表中处理此问题。

一个补充。处理此问题的方法是对键列进行查找,并将现有键转移到其他任务。


0
投票

如果您可以始终确定哪些行是好的与坏的,则可以使用条件拆分并编写表达式以根据表达式转移行。这是最简单的方法。

© www.soinside.com 2019 - 2024. All rights reserved.