SSIS:没有重复行的SQL平面文件源

时间:2013-12-29 07:56:02

标签: ssis

我有一个(有点大)平面文件(csv)。我正在尝试使用SSIS包在我的SQL Server表中导入。没有什么特别的,它是一个简单的导入。问题是,超过50%的行是重复的。

E.g。数据:

Item Number    |    Item Name     |     Update Date
ITEM-01        | First Item       | 1-Jan-2013
ITEM-01        | First Item       | 5-Jan-2013
ITEM-24        | Another Item     | 12-Mar-2012
ITEM-24        | Another Item     | 13-Mar-2012
ITEM-24        | Another Item     | 14-Mar-2012

现在我需要使用此数据创建我的主项目记录表,因为您可以看到由于更新日期数据重复。这保证了文件将始终按项目编号排序。所以我需要做的只是检查如果下一个项目编号=上一个项目编号,那么不要导入此行

我在SSIS包中使用了Sort with Remove Duplicate,但实际上它试图对所有无用的行进行排序,因为行已经排序了。此外,它需要永远排序太多。

还有其他方法吗?

2 个答案:

答案 0 :(得分:3)

您可以采取几种方法来实现这一目标。

1。聚合转换

Item NumberItem Name分组,然后对Update Date执行汇总操作。根据您上面提到的逻辑,最小操作应该有效。要使用最低操作,您需要将Update Date列转换为日期(不能对字符串执行最小)。该转换可以在数据转换转换中完成。以下是这样的内容:

enter image description here

2。脚本组件转换

基本上,您可以实现上面提到的逻辑:

  

如果下一个项目编号=上一个项目编号,则不要导入此项目   线

首先,您必须正确配置脚本组件(以下步骤假定您不重命名默认输入和输出名称):

  1. 选择转换作为脚本组件类型
  2. 在数据流中的平面文件源之后添加脚本组件:

    enter image description here

  3. 双击脚本组件以打开脚本转换编辑器
  4. 输入列下,选择所有列:

    enter image description here

  5. 输入和输出下,选择输出0 ,并将SynchronousInputID属性设置为None

    enter image description here

  6. 现在手动将列添加到输出0 以匹配输入0 中的列(不要忘记设置数据类型):

    enter image description here

  7. 最后,编辑脚本。将有一个名为Input0_ProcessInputRow的方法 - 按以下方式对其进行修改,并添加名为previousItemNumber的私有字段,如下所示:
  8.     public override void Input0_ProcessInputRow(Input0Buffer Row)
        {
            if (!Row.ItemNumber.Equals(previousItemNumber))
            {
                Output0Buffer.AddRow();
                Output0Buffer.ItemName = Row.ItemName;
                Output0Buffer.ItemNumber = Row.ItemNumber;
                Output0Buffer.UpdateDate = Row.UpdateDate;
            }  
    
            previousItemNumber = Row.ItemNumber;
        }
    
        private string previousItemNumber = string.Empty;
    

答案 1 :(得分:0)

如果性能对您来说很重要,我建议您将整个文本文件转储到SQL Server上的临时表中,然后使用SELECT DISTINCT *来获取所需的值。