我正在使用 SSIS 将数据从平面文件加载到 SQL 表。平面文件包含新行和更新行。每次运行该进程时,更新的行将影响 SQL 表的一小部分,由“周期”列指定(例如,一个过程可能仅影响周期 3、4 和 5)。
我正在使用查找转换将新行(查找无匹配输出)与现有行(查找匹配输出)分开。由于引用集和加载的数据集都非常大,我想使用部分缓存进行查找。是否可以以某种方式修改部分缓存查询以仅包含平面文件中包含的周期数中的行?
例如,我的引用表可能包含周期 1-10 的数据,但加载的平面文件可能仅包含周期 3-5 的数据。因此,我只想缓存周期 3-5 的数据,因为我已经知道周期 1-2 和周期 6-10 永远不会产生匹配。
最佳答案
不要在下拉列表中使用表选择器(除非您需要每一行中的每一列,否则您不应该这样做),而是编写查询以仅拉回匹配或扩充现有数据所需的列。就您而言,您将需要添加一个有点挑剔的过滤器。
我发现的最好方法是将查找查询写入字符串类型的变量中。在其中,我将构建查询并应用所需的过滤器。下面,您会看到我定义了两个变量。一个 int 将用作我的过滤器,然后是使用它的查询本身。
我的 SourceQuery 变量的表达式是
"SELECT
D.rn
FROM
(
SELECT TOP 10
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) * 2 AS rn
FROM
sys.all_columns AS SA
) AS D(rn)
WHERE D.rn <= " + (DT_WSTR, 10) @[User::MaxID]
我的数据流看起来像
我有我的源代码,它会进行查找,并根据匹配的结果转到两个存储桶之一。我的源查询仅生成数字 1 到 10,而查找是生成从 2 到 20 的偶数的查询。
在设计期间,该查询看起来像
SELECT
D.rn
FROM
(
SELECT TOP 10
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) * 2 AS rn
FROM
sys.all_columns AS SA
) AS D(rn)
正常运行会导致存储桶之间的比例为 50/50
目标当然是让查找查询采用类似于源组件之一的参数,但您很快就会发现
SELECT
D.rn
FROM
(
SELECT TOP 10
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) * 2 AS rn
FROM
sys.all_columns AS SA
) AS D(rn)
WHERE D.rn > ?
不会飞。相反,您必须返回控制流并选择数据流,右键单击并选择属性。在数据流窗口中,转到表达式并单击省略号 (...)
将会有一个名为您的查找任务的属性。分配使用表达式的变量,使其全部动态,瞧,最大 ID 为 6,我只找到 3 个匹配
最后一点,部分缓存可能是也可能不是您正在寻找的东西。这是一个实际的查找设置,控制如何平衡查找数据与本地缓存的成本。完整的缓存会将适用范围的所有指定列放入内存中,这就是为什么您只想指定所需的列。如果您可以将其缩减为几列,即使有数百万行,您也可能不会感到痛苦。
关于ssis - 将查找转换部分缓存限制为加载的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19574737/