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

时间:2019-03-07 22:25:07

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

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

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

namespace Bookshelf.Data.Migrations
    [DbContext(typeof(ApplicationDbContext))]
    partial class ApplicationDbContextModelSnapshot : ModelSnapshot
    {
        protected override void BuildModel(ModelBuilder modelBuilder)
        {
        ...

        modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b =>
            {
                b.Property<string>("Id")
                    .ValueGeneratedOnAdd();

                b.Property<string>("ConcurrencyStamp")
                    .IsConcurrencyToken();

                b.Property<string>("Name")
                    .HasMaxLength(256);

                b.Property<string>("NormalizedName")
                    .HasMaxLength(256);

                b.HasKey("Id");

                b.HasIndex("NormalizedName")
                    .IsUnique()
                    .HasName("RoleNameIndex")
                    .HasFilter("[NormalizedName] IS NOT NULL");

                b.ToTable("AspNetRoles");
            });

如果我有两行具有相同的主键,尝试同时插入两者将导致SSIS包崩溃,但是如果我添加错误日志记录来记录重复的行,则我有1/2机会记录错误的记录

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

只要我能始终如一地确定有效记录(例如:| KeyColumn | TextColumn | | 1 | 'ValidRecord' | | 1 |'InvalidRecord'| | 2 | 'ValidRecord' | 永远不要包含文本TextColumn),如何创建SSIS任务以始终将正确的记录写入我的SSIS表并发送记录任务记录不正确?

3 个答案:

答案 0 :(得分:1)

您可以使用2种方法实现这一目标:

(1)使用脚本组件

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

  1. 首先,添加1个类型为DT_BOOL的输出列(示例名称:标志)
  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

答案 1 :(得分:0)

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

类似的注释- 在您提供的表中,键列不能包含两行,且两行的值均为1。您应该能够在登台表中处理此问题。

一个附加地址。处理此问题的方法是在键列上查找并将现有键转移到其他任务。

答案 2 :(得分:0)

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