2

我正在使用 SSIS 将数据从平面文件加载到 SQL 表中。平面文件包含新行和更新行。每次运行进程时,更新的行都会影响 SQL 表的一小部分,由“周期”列指定(例如,一个过程可能只影响周期 3、4 和 5)。

我正在使用查找转换将新行(查找无匹配输出)与现有行(查找匹配输出)分开。由于引用集和正在加载的数据集都非常大,我想使用部分缓存进行查找。是否可以以某种方式修改部分缓存查询以仅包含平面文件中包含的期间编号中的行?

例如,我的参考表可能包含周期 1-10 的数据,但我正在加载的平面文件可能只有周期 3-5 的数据。因此,我只想缓存周期 3-5 的数据,因为我已经知道周期 1-2 和 6-10 永远不会产生匹配。

4

2 回答 2

2

不要使用下拉列表中的表选择器,除非您需要每一行中的每一列,否则您永远不应该这样做,而是编写查询以仅拉回匹配或扩充现有数据所需的列。在您的情况下,您将需要添加一个有点挑剔的过滤器。

我发现的最佳方法是在字符串类型的变量中编写查找查询。在其中,我将构建查询并应用所需的过滤器。下面,您会看到我定义了两个变量。一个 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 > ?

不飞。相反,您必须返回控制流并选择数据流,右键单击并选择属性。在数据流的窗口中,转到表达式并单击省略号 (...)

在此处输入图像描述

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

在此处输入图像描述

最后一点,部分缓存可能是也可能不是您正在寻找的东西。这是一个实际的查找设置,它控制它如何平衡查找数据与本地缓存的成本。完整缓存会将适用范围的所有指定列放入内存中,这就是您只想指定所需列的原因。如果你能把它缩小到几列,即使它是数百万行,你也可能不会感到痛苦。

于 2013-10-24T19:58:33.977 回答
1

人为的例子:

  1. 在运行时收集您的周期最小值和最大值并将它们存储在两个变量中,PeriodMinimum 和 PeriodMaximum(我假设它是一个范围,我将在最后讨论替代方案。)
  2. 将它们作为派生列添加到源流。
  3. 在 Lookup Editor 中的 Advanced 选项卡下,使用自定义查询(人为示例):SELECT lookup, value FROM reference where period between ? 和 ?
  4. 单击“参数”按钮并适当地使用您的输入列。

如果您希望能够随机选择句点(3、6 和 10)而不是一个范围,那么您将不得不做一些更人为的事情......

  1. 创建多个变量 Period1, 2, 3 ... n 并将默认值设置为 -1 或某个不是有效期间的值。
  2. 根据需要使用您要过滤的时段填充这些变量。
  3. 在自定义查询中,使用 SELECT 查找,value FROM reference where period = ? 或期间=?或句号 = ?, ...
  4. 使用输入列设置每个参数。

无论如何,一般来说,当您想要基于运行时数据的动态查找查询时,请使用带参数的自定义查询。

于 2013-10-24T19:53:28.093 回答