在SSIS数据流中,是否有比“SSIS”更好的方法为所有列创建不同的行;排序;?
在SSIS数据流中,是否有比“排序”更好的方法为所有列生成不同的行? 下面是一些细节,但我想问的是,在合并四个平面文件后,是否有更好的方法使我的集合变得清晰。 我有一个SSIS项目,在这个项目中,我读取四个不同的以制表符分隔的文本文件,合并它们,然后将它们插入到数据库表中。在将行插入数据库表之前,我一直认为“Sort”是使行变得不同的唯一方法 在理想情况下,我会处理唯一的行,但现实情况是我没有唯一的行,我无法在源数据到达我面前清理它 当我的项目运行时,我确信一定有更好的方法来实现这一点——我所说的更好,不仅是指性能,而且是指在SSIS中的设置更简单、更直接 我在网上看到的“排序”示例只选择了大得多的表中的几列,而“删除具有重复排序值的行”选项(如果按字面理解)只会检查所选列中的重复。所以为了确保我没有遗漏任何东西,我按所有列进行排序。不幸的是,我不需要对任何列进行排序——我在客户端处理。因此,有一个性能的打击 为了给你一个规模感,这里有一个屏幕截图,而我在调试模式。没有错误,所以至少我已经走了这么远 谢谢你的建议 这里是“排序”框的屏幕截图,这样您就可以看到所涉及的列数,以及在插入到数据库表之前,我当前如何使我的集合与众不同 如果您的要求是“在到达目的地之前识别并删除重复项”,您可以看到这只能通过使用某种临时保留结构来实现,因为SSI必须拉入文件的每个值,以了解任何给定行是否为重复项 我个人的建议是编写一个脚本任务,从文件中删除行级的重复项在SSIS数据流中,是否有比“SSIS”更好的方法为所有列创建不同的行;排序;?,ssis,Ssis,在SSIS数据流中,是否有比“排序”更好的方法为所有列生成不同的行? 下面是一些细节,但我想问的是,在合并四个平面文件后,是否有更好的方法使我的集合变得清晰。 我有一个SSIS项目,在这个项目中,我读取四个不同的以制表符分隔的文本文件,合并它们,然后将它们插入到数据库表中。在将行插入数据库表之前,我一直认为“Sort”是使行变得不同的唯一方法 在理想情况下,我会处理唯一的行,但现实情况是我没有唯一的行,我无法在源数据到达我面前清理它 当我的项目运行时,我确信一定有更好的方法来实现这一点——我所说
如果出于任何原因,您不想修改文件并想将所有内容保留在内存中,您也可以将结果写入记录集目标,然后将其用作脚本源中的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计划作为一个单独的答案贴了出来,尽管我不认为我会这么做