在数据流任务中,如何使用另一个来源的值限制行的流动?

时间:2019-04-15 10:22:47

标签: merge ssis dataflow

我有一个带有许多标签的Excel工作表。说一个叫wsMain,另一个叫wsDate。

在数据流转换中,我能够将数据从wsMain成功加载到我的表中。

现在,我必须更新此转换,在该转换中,我必须从工作表wsDate中获取最大日期,并且仅从wsMain加载数据,该日期小于wsDate中的最大日期(这是唯一可用的列)

因此,我发现我需要创建一个新的Excel连接管理器来从wsDate中读取数据,并且我使用了Aggregate转换来获取最大日期。

现在的问题是我如何使用这个日期来限制来自wsMain的行?

我从下面的链接中了解到,您可以将值存储在变量中,但是下一步我该怎么做? SSIS set result set from data flow to variable

我尝试过使用合并联接,但是不确定是否正确。

这是现在的样子:

https://imgur.com/dAXsGpm

3 个答案:

答案 0 :(得分:1)

我无法实现上述目标,但想知道是否有可能。作为一种变通方法,我创建了一个单独的数据流,在其中将值存储在变量中,然后在条件拆分中使用变量来过滤所需的行:

enter image description here

这是我逐步编写变量的分步指南: https://www.proteanit.com/2008/12/11/ssis-writing-to-a-package-variable-in-a-dataflow/

答案 1 :(得分:1)

您首先可以获取wsDate列的最大值,使用它作为过滤器可以避免将不必要的记录引入到数据流中,而有条件的记录会丢弃这些记录。以下是此过程的概述。我还建议确认涉及的所有列的数据类型。

  • 创建一个SSIS DateTime变量并将其命名为描述性名称,例如MaxDate

  • 使用Excel Source组件在当前任务之前创建一个数据流任务。对数据访问模式使用SQL命令选项,然后输入一条SQL语句以返回wsDate列的最大值。在以下示例中,ExcelSource是要从中拉出的工作表的名称。我建议也使用Excel Source上的Preview按钮来确认查询。

  • 在Excel Source之后添加脚本组件(不是Task)。在脚本组件主页上的MaxDate字段中添加ReadWriteVariables变量。在“输入和输出”窗格上,将Excel来源的输出列添加为用法类型为ReadOnly的输入列。下面的示例C#代码如下。请注意,只能在PostExecute方法中写入变量。对于Input0_ProcessInputRow方法,每经过的行都会被调用一次,但是在这种情况下,只会有一行。在以下代码中,MaxExcelDate是Excel Source中输出列的名称。

  • 在“数据流任务”的Excel Source组件中(从Excel导入记录),将“数据访问模式”更改为SQL命令,然后输入SQL语句以返回日期小于或等于日期的记录。最大wsDate值。这是最后一个示例,?是该参数的占位符。输入此SQL后,单击Parameters按钮,然后在Parameters字段中选择Parameter0,在Variables字段中选择MaxDate变量,并选择Input的方向。然后可以删除条件拆分,因为这些记录现在将被过滤掉。

Excel MAX wsDate SELECT:

SELECT MAX(wsDate) AS MaxExcelDate FROM ExcelSource

C#脚本组件:

DateTime maxDate;
public override void PostExecute()
{
    base.PostExecute();
    Variables.MaxDate = maxDate;
}
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
    maxDate = Row.MaxExcelDate;
}

带有日期过滤器的Excel命令:

SELECT 
    Column1,
    Column2,
    Column3
FROM ExcelSheet 
WHERE DateColumn <= ?

答案 2 :(得分:1)

是的,有可能。在数据流中,您将需要确定已存在的最大日期。接下来,您将需要在日期列上合并两个数据流。从那里,您将其馈入有条件的分割,并在日期列匹配[即!ISNULL()]与不匹配[即ISNULL()]的位置进行拆分。在您的情况下,您只需要匹配项。不匹配项将被忽略。

注意:如果您在MERGE JOIN上使用INNER JOIN,而只有一个日期(即MaxDate)可以加入,那么这将为您处理行过滤。您将不需要条件分裂。

欢迎使用ETL。

更新

SSIS的MERGE JOINs仅对EQUAL操作执行联接,而不是LESS THAN和GREATER THAN操作,这确实是一个痛苦。您将需要分离数据流。

  1. 使用脚本组件扫描excel文件中的“最大日期”,并将该值分配给SSIS中的程序包变量。另外,您可以在SQL Server中有一个日期表,然后在SSIS中使用Execute SQL命令从表中检索MAX Date并将该值分配给包变量
  2. 修改现有数据流,以完全删除Excel日期文件的读取。然后添加DERIVED COLUMN转换并添加一个新列,该列映射到SSIS中存储最大日期的包变量。您可以将派生列名称命名为“ MaxDate”
  3. 使用以下条件逻辑添加条件拆分转换:[AsOfDt] <= [MaxDate]
  4. 设置输出名称以插入记录

注意:CONDITIONAL SPLIT使用限制/过滤的行创建一个新的输出数据流。它不会在现有数据流中创建新列。可以认为这是从列修改到行修改的数据流输出的转换。仅将符合条件的那些行发送到所需的输出。我假设您只想插入这些记录,所以我将其命名为。您可以选择自己喜欢的命名约定

注2:很抱歉没有将“更新”作为我的原始答案-之前我没有使用过AGGREGATE转换,所以我不知道它会限制行输出,而不是读取数据流中的值然后分配给一个变量。对于Microsoft添加到SSIS而言,这将是一次了不起的转变。看来ROWCOUNT和SCRIPT COMPONENT转换是唯一能够在数据流中设置包变量值的转换。