Select 在 SSIS 错误记录任务期间写入了哪些行
Select which rows are written during SSIS error logging tasks
如果我尝试使用 SSIS 将两个非不同的行插入到带有主键的 table 中,我如何确定哪一行写入 table 以及哪一行由 table 处理错误记录任务?
例如,我有一个包含两列和一个主键约束的目标 table,我正尝试从源 table 插入两行,它们具有相同的值但没有主键键约束。
(KeyColumn UNIQUEIDENTIFIER NOT NULL, TextColumn VARCHAR(50) NULL)
如果我有两行具有相同的主键,尝试插入这两行会使 SSIS 包崩溃,但如果我添加错误日志记录来记录重复的行,我有 1/2 的机会记录不正确的记录
| KeyColumn | TextColumn |
| 1 | 'ValidRecord' |
| 1 |'InvalidRecord'|
| 2 | 'ValidRecord' |
如果我可以始终如一地确定有效记录(例如:TextColumn
永远不应包含文本 'Invalid'
),我如何创建一个 SSIS 任务以始终将正确的记录写入我的 SSIS table 并将不正确的记录发送到日志记录任务?
在OLEDb destination editor中,有Rows per batch设置,你可以在里面输入1。然后,当 SSIS 失败时,您将获得失败的记录。
类似的说明 -
在您提供的 table 中,键列不能有两行的值都为 1。您应该可以在暂存 table.
中处理此问题
加一个。处理这个问题的方法是查找键列并将现有键转移到另一个任务。
如果您可以始终如一地确定哪些行是好的哪些行是坏的,您可以使用条件拆分并编写一个表达式来根据表达式转移行。这是最简单的方法。
您可以使用 2 种方法实现此目的:
(1) 使用脚本组件
如果需要根据KeyColumn查重(第一次有效,其他无效),可以使用脚本组件来实现。
- 首先,添加 1 个
DT_BOOL
类型的输出列(示例名称: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
路径映射到目标 table 并将 False
路径映射到错误记录目标
(2) 使用条件拆分
如果你能根据text列检查orw是否有效,那么你可以添加条件拆分,表达式如下:
FINDSTRING([TextColumn],'InvalidRecord',1) == True
如果我尝试使用 SSIS 将两个非不同的行插入到带有主键的 table 中,我如何确定哪一行写入 table 以及哪一行由 table 处理错误记录任务?
例如,我有一个包含两列和一个主键约束的目标 table,我正尝试从源 table 插入两行,它们具有相同的值但没有主键键约束。
(KeyColumn UNIQUEIDENTIFIER NOT NULL, TextColumn VARCHAR(50) NULL)
如果我有两行具有相同的主键,尝试插入这两行会使 SSIS 包崩溃,但如果我添加错误日志记录来记录重复的行,我有 1/2 的机会记录不正确的记录
| KeyColumn | TextColumn |
| 1 | 'ValidRecord' |
| 1 |'InvalidRecord'|
| 2 | 'ValidRecord' |
如果我可以始终如一地确定有效记录(例如:TextColumn
永远不应包含文本 'Invalid'
),我如何创建一个 SSIS 任务以始终将正确的记录写入我的 SSIS table 并将不正确的记录发送到日志记录任务?
在OLEDb destination editor中,有Rows per batch设置,你可以在里面输入1。然后,当 SSIS 失败时,您将获得失败的记录。
类似的说明 - 在您提供的 table 中,键列不能有两行的值都为 1。您应该可以在暂存 table.
中处理此问题加一个。处理这个问题的方法是查找键列并将现有键转移到另一个任务。
如果您可以始终如一地确定哪些行是好的哪些行是坏的,您可以使用条件拆分并编写一个表达式来根据表达式转移行。这是最简单的方法。
您可以使用 2 种方法实现此目的:
(1) 使用脚本组件
如果需要根据KeyColumn查重(第一次有效,其他无效),可以使用脚本组件来实现。
- 首先,添加 1 个
DT_BOOL
类型的输出列(示例名称: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
路径映射到目标 table 并将False
路径映射到错误记录目标
(2) 使用条件拆分
如果你能根据text列检查orw是否有效,那么你可以添加条件拆分,表达式如下:
FINDSTRING([TextColumn],'InvalidRecord',1) == True