我使用SSIS将数据从平面文件加载到SQL表。平面文件包含新行和更新行。每次进程运行时,更新的行将影响SQL表的一个小子集,由“句点”列指定(例如,一个过程可能只影响周期3、4和5)。
我使用查找转换将新行(查找没有匹配输出)与现有行的(查找匹配输出)分开。由于所加载的引用集和数据集都非常大,所以我想使用部分缓存进行查找。是否可以以某种方式修改部分缓存查询,使其只包括平面文件中包含的句号中的行?
例如,我的参考表可能包含句点1-10的数据,但是正在加载的平面文件可能只有3-5个句点的数据。因此,我只想缓存3-5期的数据,因为我已经知道句点1-2和6-10永远不会产生匹配。
发布于 2013-10-24 19:58:33
不要在下拉列表中使用表选择器,除非您需要每行的每一列,否则永远不应该使用该选项,而是编写查询,以便只撤回匹配或增强现有数据所需的列。在您的情况下,您将需要添加一个过滤器,这是一个有点挑剔。
我发现的最佳方法是用字符串类型的变量编写查找查询。在其中,我将构建查询并应用所需的过滤器。下面,我定义了两个变量。一个作为我的过滤器的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 > ?不会飞。相反,您必须返回到Control流并选择数据流,右键单击并选择Properties。在数据流窗口中,转到表达式并单击省略号(.)

将有一个名为“查找任务”的属性。为使用表达式的变量赋值,使其全部是动态的,瞧,最大it为6,我只找到3次匹配。

最后,部分缓存可能是你想要的,也可能不是你想要的。这是一个实际的查找设置,它控制如何平衡查找数据的成本和本地缓存数据的成本。完整缓存将将适用范围的所有指定列删除到内存中,这就是为什么只需要指定所需的列的原因。如果你能把它写成几根瘦削的柱子,即使它是几百万行,你也可能不会感到疼痛。
发布于 2013-10-24 19:53:28
人为的例子:
如果你想要随机选择周期(3,6,10)而不是一个范围,那么你必须做一些更人为的事情.
总之,通常,当您想要基于运行时数据的动态查找查询时,请使用带有参数的自定义查询。
https://stackoverflow.com/questions/19574737
复制相似问题