【问题标题】:Select which rows are written during SSIS error logging tasks选择在 SSIS 错误记录任务期间写入哪些行
【发布时间】:2019-07-29 22:18:21
【问题描述】:

如果我尝试使用 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


【解决方案1】:

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

(1) 使用脚本组件

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

  1. 首先,添加1个DT_BOOL类型的输出列(示例名称:标志)
  2. 在Script里面使用类似的脚本:

    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) 使用条件拆分

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

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

【讨论】:

    【解决方案2】:

    在 OLEDb 目标编辑器中,有 Rows per batch 设置,您可以在其中输入 1。然后,当 SSIS 失败时,您将获得失败的记录。

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

    添加一个。处理此问题的方法是查找键列并将现有键转移到另一个任务。

    【讨论】:

    • 我已经禁用了快速加载(自动将 Rows Per Batch 设置为 1)。为了澄清,我已经创建了错误输出任务。问题是我可以在哪里确定哪些行被写入表,哪些行在有两个重复的主键时被记录。查找没有解决这个问题,因为它处理行先到先得,而不是按行内容。
    • 我发现您的方法存在固有的矛盾。主键不能重复。因此,在 etl 进程中,在插入行之前通常会处理该问题。我对完整场景的理解也有限。您是否尝试过使用重定向行从目标创建错误输出到错误表?然后您可以创建一个存储过程来从该表发送电子邮件等..
    • 我会更新帖子以使其更加清晰。这个问题是当您的源有两个重复值但目标无法处理时该怎么办。重定向的行实际上被设置为一个异常表,但我没有在帖子中包含它,因为我不想让事情过于复杂。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-31
      • 2013-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多