我有一个带有许多标签的Excel工作表。说一个叫wsMain,另一个叫wsDate。
在数据流转换中,我能够将数据从wsMain成功加载到我的表中。
现在,我必须更新此转换,在该转换中,我必须从工作表wsDate中获取最大日期,并且仅从wsMain加载数据,该日期小于wsDate中的最大日期(这是唯一可用的列)
因此,我发现我需要创建一个新的Excel连接管理器来从wsDate中读取数据,并且我使用了Aggregate转换来获取最大日期。
现在的问题是我如何使用这个日期来限制来自wsMain的行?
我从下面的链接中了解到,您可以将值存储在变量中,但是下一步我该怎么做? SSIS set result set from data flow to variable
我尝试过使用合并联接,但是不确定是否正确。
这是现在的样子:
答案 0 :(得分:1)
我无法实现上述目标,但想知道是否有可能。作为一种变通方法,我创建了一个单独的数据流,在其中将值存储在变量中,然后在条件拆分中使用变量来过滤所需的行:
这是我逐步编写变量的分步指南: 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操作,这确实是一个痛苦。您将需要分离数据流。
[AsOfDt] <= [MaxDate]
注意:CONDITIONAL SPLIT使用限制/过滤的行创建一个新的输出数据流。它不会在现有数据流中创建新列。可以认为这是从列修改到行修改的数据流输出的转换。仅将符合条件的那些行发送到所需的输出。我假设您只想插入这些记录,所以我将其命名为。您可以选择自己喜欢的命名约定
注2:很抱歉没有将“更新”作为我的原始答案-之前我没有使用过AGGREGATE转换,所以我不知道它会限制行输出,而不是读取数据流中的值然后分配给一个变量。对于Microsoft添加到SSIS而言,这将是一次了不起的转变。看来ROWCOUNT和SCRIPT COMPONENT转换是唯一能够在数据流中设置包变量值的转换。