如果我尝试使用SSIS将两个不同的行插入到具有主键的表中,如何确定将哪个行写入表以及哪个行由错误记录任务处理?
例如,我有一个目标表,其中包含两列和一个主键约束,我试图从源表中插入两行具有相同值但没有主键约束的行。
(KeyColumn UNIQUEIDENTIFIER NOT NULL, TextColumn VARCHAR(50) NULL)
如果我有两行具有相同的主键,尝试插入两个将导致SSIS包崩溃,但如果我添加错误记录以记录重复行,我有1/2的机会记录不正确的记录
| KeyColumn | TextColumn |
| 1 | 'ValidRecord' |
| 1 |'InvalidRecord'|
| 2 | 'ValidRecord' |
如果我可以一致地确定有效记录(例如:TextColumn
永远不应该包含文本'Invalid'
)如何创建SSIS任务以始终将正确的记录写入我的SSIS表并将错误的记录发送到日志记录任务?
您可以使用两种方法实现此目的:
如果需要根据键列检查重复项(第一次出现是有效的,则其他项无效),您可以使用脚本组件来实现。
DT_BOOL
类型的1输出列(示例名称:Flag)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;
}
}
}
Flag
列值添加条件拆分以拆分行:
[Flag] == True
True
路径映射到目标表,将False
路径映射到错误记录目标如果您可以根据文本列检查orw是否有效,则可以使用以下表达式添加条件拆分:
FINDSTRING([TextColumn],'InvalidRecord',1) == True
在OLEDb目标编辑器中,每批次设置行,您可以在那里输入1。然后,当SSIS失败时,您将获得失败的记录。
在类似的说明中 - 在您提供的表中,键列不能具有两个具有相同值1的行。您应该能够在登台表中处理此问题。
一个补充。处理此问题的方法是对键列进行查找,并将现有键转移到其他任务。
如果您可以始终确定哪些行是好的与坏的,则可以使用条件拆分并编写表达式以根据表达式转移行。这是最简单的方法。