我正在使用SQL Server 2005来开发SSIS包。我的数据流包含SSIS查找。我正在处理的每一行都有这些列(其中包括):ID1,detailsID1,ID2,detailsID2。应该从基于ID1的查找加载列detailsID1的值,并且基于ID2从另一个查找中加载detailsID1的值。问题是这两个查找是相同的:我对同一个表上的相同列进行相同的选择(ID1和ID2是一个表包含的记录的一些ID)。有什么方法我只能使用一个查找来加载两个细节列?我不想使用2次查找,因为该表很大。
你有什么想法我怎么能这样做?任何想法都非常感谢!
答案 0 :(得分:1)
Lookup组件对于大型表来说可能很痛苦。您可以尝试几种选择。
首先,使用将查找表连接到源数据的SQL语句。这将需要多个数据流任务。您现有的数据流将输出到数据库中的目标登台表。然后,您可以创建一个新的数据流,其中源是一个查询,每次查找登台表时都会连接查找表一次。查询的示例可能是:
SELECT lt1.detailsID1, lt2.detailsID2, <other StagingTable columns>
FROM StagingTable st
LEFT OUTER JOIN LookupTable lt1 ON st.ID1 = lt1.ID1
LEFT OUTER JOIN LookupTable lt2 ON st.ID2 = lt2.ID2
查找作为SQL查询的一部分完成。
另一个选择是使用数据流组件进行连接过程。请注意,这个将在运行SSIS包的计算机上使用大量内存。
使用当前数据流添加一个新的源,从查找表中获取数据。将多播组件添加到数据流,并创建从源输出到多播输入的数据流路径。
添加合并连接组件并将主源的输出添加为左输入,并将第一个多播输出添加为右输入。请注意,输入必须已按连接键的顺序排序(第一个连接的ID1和第二个连接的ID2 - 请参见下文)。将Merge Join配置为左外连接,并在ID1列上匹配。在输出中包含DetailID1列
添加排序组件和第二个合并连接。第一个Merge连接的输出转到Sort组件。将排序键设置为ID2列。 Sort输出作为Left join输入转到第二个Merge Join组件。第二个多播输出转到第二个合并连接输入。配置第二个Merge Join与第一个Merge Join相同,但是对于ID2列。
正如您所看到的,这个过程需要做更多的工作。第一个解决方案可能是您最好的解决方案,但您应该比较解决方案以获得最佳性能。