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

Posted

技术标签:

【中文标题】SSIS - 将 Fact 与查找表匹配两次时重用 Ole DB 源【英文标题】:SSIS - Reuse Ole DB source when matching Fact against lookup table twice 【发布时间】:2016-02-01 21:38:59 【问题描述】:

我对@9​​87654324@ 和 BI 很陌生,所以如果这是一个新手问题,首先很抱歉。

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

csv中的数据结构是这样的

... userId, OriginStationId, DestinyStationId,..

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

    使用 OLE DB 源读取查找数据 读取我的 csv 文件 按同一字段对两个输入进行排序 通过 Id 进行左连接,以获得 SK

这样,如果没有匹配项(也就是找不到代理键),我可以将其重定向到被拒绝的 csv 并稍后处理。

类似这样的:

(对不起西班牙语!)

我对每个维度都这样做,所以我可以用不同的错误代码处理每个维度。

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

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

我看到有一个“缓存选项”,这是最好的方法吗? (尽管这意味着创建另一个 OLE DB source.. 对吗?)

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

有些列的排序顺序为 2 到 2

最好的方法是什么? 还是我想错了? 如果有不清楚的地方告诉我,我会更新我的问题

【问题讨论】:

您可以在任何组件之后使用多播来创建多个输出。 我还没有听说过那个组件,但现在我正在阅读它,它似乎可以实现我想要实现的目标。我会在晚上检查它,但根据这个mssqltips.com/sqlservertip/2047/… 它似乎适合我的情况。您应该将其发布为答案 【参考方案1】:

任何时候您希望您可以从一个只允许一个的组件获得多个输出,您所要做的就是在该组件之后使用 Multicast 组件,其唯一目的是将数据流流拆分为多个输出。

【讨论】:

【参考方案2】:

贡萨洛

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

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

数据流有两个“查找”任务。第一个将属性 Lookup1 与描述相结合,以派生其 Id。第二个将属性 Lookup2 与 Description 连接起来以派生不同的 Id。

这是数据流:-

请注意,需要“数据转换”才能将 CSV 文件中的字符串属性转换为“Unicode 字符串 [DT_WSTR]”,以便将它们连接到表中的 nvarchar(50) 描述属性。

这是数据转换:-

这是第一个查找(第二个将“Lookup2 的副本”加入到描述中):-

这是数据查看器的输出,其中包含两个派生 ID CodeTableFirstId 和 CodeTableSecondId:-

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

干杯约翰

【讨论】:

以上是关于SSIS - 将 Fact 与查找表匹配两次时重用 Ole DB 源的主要内容,如果未能解决你的问题,请参考以下文章

在 SSIS 2019 中面临查找转换的问题

SSIS 查找行为很奇怪

SSIS - 将Excel与数据库进行比较

SSIS 2008 查找转换的问题

SSIS 查找在 varchar 字段上找不到匹配项

将 SSIS 包转换为 .NET 应用程序?