Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SSIS数据流中,是否有比“SSIS”更好的方法为所有列创建不同的行;排序;?_Ssis - Fatal编程技术网

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

在SSIS数据流中,是否有比“SSIS”更好的方法为所有列创建不同的行;排序;?,ssis,Ssis,在SSIS数据流中,是否有比“排序”更好的方法为所有列生成不同的行? 下面是一些细节,但我想问的是,在合并四个平面文件后,是否有更好的方法使我的集合变得清晰。 我有一个SSIS项目,在这个项目中,我读取四个不同的以制表符分隔的文本文件,合并它们,然后将它们插入到数据库表中。在将行插入数据库表之前,我一直认为“Sort”是使行变得不同的唯一方法 在理想情况下,我会处理唯一的行,但现实情况是我没有唯一的行,我无法在源数据到达我面前清理它 当我的项目运行时,我确信一定有更好的方法来实现这一点——我所说

在SSIS数据流中,是否有比“排序”更好的方法为所有列生成不同的行?

下面是一些细节,但我想问的是,在合并四个平面文件后,是否有更好的方法使我的集合变得清晰。

我有一个SSIS项目,在这个项目中,我读取四个不同的以制表符分隔的文本文件,合并它们,然后将它们插入到数据库表中。在将行插入数据库表之前,我一直认为“Sort”是使行变得不同的唯一方法

在理想情况下,我会处理唯一的行,但现实情况是我没有唯一的行,我无法在源数据到达我面前清理它

当我的项目运行时,我确信一定有更好的方法来实现这一点——我所说的更好,不仅是指性能,而且是指在SSIS中的设置更简单、更直接

我在网上看到的“排序”示例只选择了大得多的表中的几列,而“删除具有重复排序值的行”选项(如果按字面理解)只会检查所选列中的重复。所以为了确保我没有遗漏任何东西,我按所有列进行排序。不幸的是,我不需要对任何列进行排序——我在客户端处理。因此,有一个性能的打击

为了给你一个规模感,这里有一个屏幕截图,而我在调试模式。没有错误,所以至少我已经走了这么远

谢谢你的建议

这里是“排序”框的屏幕截图,这样您就可以看到所涉及的列数,以及在插入到数据库表之前,我当前如何使我的集合与众不同

如果您的要求是“在到达目的地之前识别并删除重复项”,您可以看到这只能通过使用某种临时保留结构来实现,因为SSI必须拉入文件的每个值,以了解任何给定行是否为重复项

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

  • 创建一个名为“清除TSV文件”的脚本任务
  • 在脚本中创建一个名为校验和的数组
  • 在脚本中,打开每个TSV文件并在循环中读取,每次一行
  • 对行调用String.GetHashCode()
  • 如果该值是校验和,则抛出该行,这是一个重复
  • 如果不是,则将结果值存储在校验和中,并将该行传递给其他文件对象
  • 将新文件对象保存到SSIS可以看到的位置
  • 现在,您将有4个已清理的文件,可以合并并插入数据库


    如果出于任何原因,您不想修改文件并想将所有内容保留在内存中,您也可以将结果写入记录集目标,然后将其用作脚本源中的ADO对象,但这可能会占用大量内存。

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

    这种方法不会浪费时间对数据进行排序。这也让我确信我得到了真正不同的行,就像我期望的那样。这可能不是最好的方法,毫无疑问会让一些人畏缩,但这是一种我能够用我目前的技能实现的方法。这一切都是因为微软没有在数据流任务栏中添加“独特的联合”选项

    更新: 根据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
    

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


    注意:无论您选择何种方法,都会对性能造成影响,但这会产生不同的影响,而不是排序。

    行是否真正、完全、100%相同?就像一个直接的字符串比较会发现它们是一样的?如果有重复的,插入哪个文件的行并不重要,对吗?是的。当两行或多行重复时,它们在所有列中都是重复的。这是我必须面对的现实。我并不是选择一行插入另一行:我只是想使这些行不同,就像我们用“Select distinct*from…”查询表时所做的那样。您可以删除目标数据库中的重复行吗?为了便于对话,我尝试避免这样做。我需要把精力集中在所述问题的范围和位置上。我没有包括很多背景故事,因为我不想在混合中引入任何红鲱鱼。关键是我需要在合并它们之后将它们区分开来,因为同一行可能出现在多个表中。这解决了这个问题,一旦一行被“检查”并传递,与之匹配的任何其他行都将从任何文件中丢弃,因为其校验和在数组中。一旦运行此脚本,您的文件将不会在任何文件中包含重复项,因为每个唯一行实例只向修改后的文件/记录集传播一次。所介绍的技术对我来说是新的,因此,我需要学习如何做一些项目。谢谢你的建议。今天晚些时候我会让你知道它是如何工作的。在研究了“脚本任务”之后,我发现目前的学习曲线有点陡峭。因此,虽然我相信这是一个解决方案,但由于我目前的技能差距,目前这并不是最好的解决方案。我把我的B计划作为一个单独的答案贴了出来,尽管我不认为我会这么做