在SSIS数据流中,有没有比“排序”更好的方法为所有列创建不同的行?

时间:2014-11-18 17:52:56

标签: ssis

在SSIS数据流中,是否有更好的方法为所有列创建不同的行而不是"排序"?

以下是详细信息,但我要问的是,在将四个平面文件合并后是否有更好的方法使我的设置不同。

我有一个SSIS项目,我在其中读取四个不同的制表符分隔的文本文件,将它们联合起来,然后将它们插入到数据库表中。我被引导相信"排序"是在将行插入数据库表之前使行不同的唯一方法。

在一个理想的世界中,我会处理独特的行,但实际情况是我没有唯一的行,而且在它传到我之前我无法清理源数据。

虽然我的项目有效,但我确信必须有更好的方法来做到这一点 - 更好的是,我的意思不仅在于性能方面,而且在更简单,更直接的意义上更好在SSIS中建立。

"排序"的例子我在网上看到只选择一个更大的表的几列,并选择"删除具有重复排序值的行" - 如果按字面意思采用 - 只检查那些选定列中的重复。因此,为了确保我没有遗漏任何内容,我按所有列排序。不幸的是,我不需要对我的任何列进行排序 - 我在客户端处理它。因此,性能受到了打击。

为了给您一种规模感,这是我在调试模式下的屏幕截图。没有错误,所以至少我已经走了这么远。

感谢您的任何想法。

SSIS Diagram of Data Flow in Debug Mode

这是"排序"的截图。框,以便您可以在插入数据库表之前查看所涉及的列数以及我当前如何使我的设置不同。

Sort to Make Distinct

3 个答案:

答案 0 :(得分:1)

这是我在提出问题时没有考虑的另一种方法:在“控制流”选项卡上,在完成数据流任务后,启动一个将表读入临时表的SQL任务,清除表,然后只插入唯一的行。

这种方法不会浪费时间对数据进行排序。它也让我确信我会以我期望的方式获得真正不同的行。它可能不是 最好的方式,毫无疑问会让一些人感到畏缩,但这是一种我能用我现有技能实现的方法。所有这些都是因为Microsoft没有在数据流任务栏中添加“Distinct union”选项。

Screenshot of Control Flow tab

<强>更新 根据Kyle Hale的建议,我改进了T-SQL查询(识别并删除了特定的重复项),从而无需临时表。

WITH Dup_Rows (
    Rec_Nbr,
    Campus,
    Student_ID,
    Student_Name,
    Course_ID,
    Course_Title,
    Credit,
    Date_Earned,
    Department,
    Final_Mark,
    Grade_Level,
    School,
    Teacher,
    [Transfer]
    )
AS (
    SELECT ROW_NUMBER() OVER (
            PARTITION BY c.Campus,
            c.Student_ID,
            c.Student_Name,
            c.Course_ID,
            c.Course_Title,
            c.Credit,
            c.Date_Earned,
            c.Department,
            c.Final_Mark,
            c.Grade_Level,
            c.School,
            c.Teacher,
            c.[Transfer] ORDER BY c.Campus,
                c.Student_ID,
                c.Student_Name,
                c.Course_ID,
                c.Course_Title,
                c.Credit,
                c.Date_Earned,
                c.Department,
                c.Final_Mark,
                c.Grade_Level,
                c.School,
                c.Teacher,
                c.[Transfer]
            ) AS Rec_Nbr,
        c.Campus,
        c.Student_ID,
        c.Student_Name,
        c.Course_ID,
        c.Course_Title,
        c.Credit,
        c.Date_Earned,
        c.Department,
        c.Final_Mark,
        c.Grade_Level,
        c.School,
        c.Teacher,
        c.[Transfer]
    FROM dbo.Base__credits c
    )
DELETE
FROM Dup_Rows
WHERE Dup_Rows.Rec_Nbr > 1

答案 1 :(得分:1)

您可以在数据流中使用聚合任务。它不是排序,只是分组或总和,平均值等,您的评论是您正在寻找的。

注意:无论您选择何种方法,都会受到性能影响,但这样做会有所不同,而不是排序。

答案 2 :(得分:0)

如果您的要求是&#34;在到达目的地之前识别并删除重复项#34;,您可以看到如何通过使用某种临时保留结构来实现这一点,因为SSIS必须引入每个单个值的文件,以了解任何给定的行是否重复。

我个人的建议是编写一个脚本任务,从文件中删除在行级的重复项。

  1. 创建一个名为&#34;清理TSV文件&#34;。
  2. 的脚本任务
  3. 在脚本中创建一个名为Checksums的数组。
  4. 在您的脚本中,打开每个TSV文件并循环读取,一次一行。
  5. 在行上调用String.GetHashCode()。
  6. 如果值在Checksums中,抛出该行,那就是一个骗局。
  7. 如果没有,请将结果值存储在Checksums中,并将该行传递给其他File对象。
  8. 将新的File对象保存在SSIS可以看到的地方。
  9. 现在您已经清理了4个文件,并且可以将它们联合起来并插入到您的数据库中。

    如果由于某种原因您不想进行文件修改并希望将所有内容保存在内存中,您还可以将结果写入Recordset目标,然后将其用作脚本源中的ADO对象,但是这可能是内存密集型的。