我有一个(有点大)平面文件(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,但实际上它试图对所有无用的行进行排序,因为行已经排序了。此外,它需要永远排序太多。
还有其他方法吗?
答案 0 :(得分:3)
您可以采取几种方法来实现这一目标。
按Item Number
和Item Name
分组,然后对Update Date
执行汇总操作。根据您上面提到的逻辑,最小操作应该有效。要使用最低操作,您需要将Update Date
列转换为日期(不能对字符串执行最小)。该转换可以在数据转换转换中完成。以下是这样的内容:
基本上,您可以实现上面提到的逻辑:
如果下一个项目编号=上一个项目编号,则不要导入此项目 线强>
首先,您必须正确配置脚本组件(以下步骤假定您不重命名默认输入和输出名称):
在数据流中的平面文件源之后添加脚本组件:
在输入列下,选择所有列:
在输入和输出下,选择输出0 ,并将SynchronousInputID
属性设置为None
现在手动将列添加到输出0 以匹配输入0 中的列(不要忘记设置数据类型):
Input0_ProcessInputRow
的方法 - 按以下方式对其进行修改,并添加名为previousItemNumber
的私有字段,如下所示: 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 *
来获取所需的值。