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

标签 sql-server ssis etl sql-server-data-tools error-logging

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

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

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

如果我有两行具有相同的主键,尝试插入这两行会使 SSIS 包崩溃,但如果我添加错误日志记录来记录重复的行,我有 1/2 的机会记录不正确的记录

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

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

最佳答案

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

(1) 使用脚本组件

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

  1. 首先,添加 1 个 DT_BOOL 类型的输出列(示例名称: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) 使用条件拆分

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

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

关于sql-server - 选择在 SSIS 错误记录任务期间写入哪些行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55053783/

相关文章:

sql - Select * into #tempTable from exec 命令显示错误

c# - 使用 SqlDataAdapter 插入一行

sql-server - 有没有办法在每个 SSIS 包之前和之后启动存储过程?

visual-studio-2015 - 使用 visual studio 在线构建定义构建 SSIS 解决方案....dtproj 不受 MSBuild 支持,无法构建

sql - SSIS 表达式转 SQL 语句

database - Redshift 中的高效 ETL 更新插入

etl - DWH 和 ETL 解释

sql-server - SQL Server 批量插入访问问题

SQL-Server:关键字 'with' 附近的语法不正确。如果这个语句是一个公用表表达式

sql-server - 启动SSIS包时不支持包部分调试