SSIS - 在将事实与查找表匹配两次时重用Ole DB源

时间:2015-11-02 03:23:17

标签: csv ssis merge etl

我对SSIS和BI一般都是新手,所以首先对不起,如果这是一个新手问题。

我在csv中有事实表的源数据,所以我想将id与查找表中的代理键进行匹配。

csv中的数据结构是这样的

... userId, OriginStationId, DestinyStationId,..

我想要完成的是将数据与我的查找表进行匹配。所以我正在做的是

  1. 使用OLE DB源读取查找数据
  2. 阅读我的csv文件
  3. 按相同字段对两个输入进行排序
  4. 按Id执行左连接,以获取SK
  5. 这样,如果没有匹配(也就是找不到代理键),我可以将其重定向到被拒绝的csv并稍后处理。

    类似的东西:

    Join

    (抱歉西班牙人!)

    我正在为每个维度执行此操作,因此我可以使用不同的错误代码处理每个维度。

    由于OriginStationIdDestinyStationId是来自同一维度的两个值(它们都匹配相同的查找表),我想知道是否有办法避免从中读取两次数据table(我的意思是,不要使用两个ole db源来读取同一个表中数据的两倍)。

    我尝试在排序中添加第二个输出,但我不允许这样做。从OLE DB Source添加另一个输出也是如此。

    我看到有一个“缓存选项”,是最好的方法吗? (虽然无论如何它会暗示创建另一个OLE DB source ..对吗?)

    我想到的第三个选项是通过两个字段加入,但由于查找表中只有一个字段(同一个字段),当我尝试将csv中的两个列映射到同一个字段时,我收到错误我的查找表中的列

      

    排序顺序2到2

    缺少列

    最好的方法是什么? 或者我在想错误的东西? 如果事情不明确,请告诉我,我会更新我的问题

2 个答案:

答案 0 :(得分:3)

如果您希望从一个只允许一个组件的组件中获得多个输出,那么您所要做的就是使用Multicast组件跟随该组件,该组件的唯一目的是将数据流分割为多个输出。

答案 1 :(得分:0)

的Gonzalo

我刚刚使用这篇文章介绍了如何为数据仓库构建派生列: - How to Populate a Fact Table using SSIS (part 1)

使用这个我构建了一个简单的包,它读取一个包含两列的CSV文件,这些列用于从同一个CodeTable派生单独的值。 CodeTable有两个字段Id和Description。

数据流有两个"查找"任务。第一个将Lookup1属性与Description连接,以获取其Id。第二个将属性Lookup2与Description连接,以获得不同的Id。

以下是数据流: -

Data Flow

注意"数据转换"需要将CSV文件中的字符串属性转换为" Unicode字符串[DT_WSTR]"所以它们可以加入表中的nvarchar(50)描述属性。

以下是数据转换: -

enter image description here

这是第一个查找(第二个加入"查找副本2"到描述): -

enter image description here

以下是带有两个派生的Ids CodeTableFirstId和CodeTableSecondId的数据查看器输出: -

enter image description here

希望我理解你的问题,这对你有用。

干杯约翰