【问题标题】:Capture aggregate value from data flow task into a variable将数据流任务中的聚合值捕获到变量中
【发布时间】:2014-05-29 22:13:13
【问题描述】:

我有一个 OLEDB (SQL) 数据流源 (A),它从存储过程中提取结果集并将结果放入 OLEDB (Oracle) 数据流目标 (B)。

有没有办法在数据流任务中将数据集中的聚合值捕获到变量中?具体来说,我想从整个数据集中捕获MAX(<DateValue>)

否则,我必须在不同的数据流任务中提取相同的数据两次,无论我指向 A 还是它的新位置 B。

编辑:我已经知道如何在执行 SQL 任务的控制流中执行此操作。我之所以问是因为我很想知道我是否可以在数据流任务中完成这项工作,因为我已经在那里收集数据了。有没有办法在数据流中获取聚合值?

【问题讨论】:

  • 没问题!您可以在两者之间添加一个有条件的拆分,以便拥有一个满足您需要的脚本。但是没有数据结构,我不能给你那个脚本。
  • 我建议您在顶部使用执行 sql 任务来获取聚合。将聚合存储在变量中。简单的。顺便说一句,你为什么说你是前软件开发人员?即使现在你仍然是一个:)
  • @WickedFan 条件拆分如何做到这一点?

标签: sql-server ssis bids


【解决方案1】:

一种方法是在源和目标之间添加一个多播转换,该转换也馈送到脚本组件中。

虽然聚合变换也可以工作,但这种方法避免了添加阻塞变换

将脚本组件配置为目标,为其提供对变量的读/写访问权限,然后将脚本编辑为类似

//Instance level variable
DateTime? maxDate = null;

public override void PostExecute()
{
    base.PostExecute();

    if (maxDate.HasValue)
    {
        this.Variables.MaxDate = maxDate.Value;
    }

    System.Windows.Forms.MessageBox.Show(this.Variables.MaxDate.ToString());
}


public override void Input0_ProcessInputRow(Input0Buffer Row)
{
    if (!Row.createdate_IsNull)
    {
        maxDate = Row.createdate < maxDate ? maxDate : Row.createdate;
    }
}

【讨论】:

  • 这很好用,正是我想要的。感谢您提出使用聚合转换的替代方案。
【解决方案2】:
  • 您将当前的 DFT 保留在控制流中(源到目标的映射)
  • 在控制流中,添加一个执行 SQL 任务,使用相同的源查询并在其上应用所需的 MAX() 函数。

Eg: 
--Let the given be Your source query.
SELECT  ColumnA,
        ColumnB,
        ColumnC,
        DateValue
FROM    SourceA

--Your new query to calculate MAX() may be this.
SELECT  MAX(DateValue)
FROM    SourceA

在执行 SQL 任务中给出第二条 SQL。 在包中添加一个 int 类型的变量,在包级别范围内。 (例如:名称 = intMax)

In the Execute SQL task, not the following.
    a.general Tab
        Result Set  = Single Row
        Sql Statement = SELECT  MAX(DateValue) FROM SourceA
    b.result set Tab
        click ADD
        ResultName = 0
        variable Name = variable Name (eg: name = intMax)

从这里开始,您需要的结果将在变量中可用。

【讨论】:

  • 这不是我想要的。我以前在控制流中做过很多次。我想知道是否可以从数据流中进行。
  • 好的,在 SSIS 中,数据在管道中流动,因此不同的值在不同的实例中流经管道。认为这可能会对您有所帮助。 1. 在您的 Source 之后添加一个 LookUp 任务。 2. 在查找任务中,给出获取最大值的 SQL。 3. 现在我们有查找任务的两个输出,匹配和不匹配。匹配的管道将给出 Max()。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-05
  • 1970-01-01
  • 2021-04-17
  • 1970-01-01
  • 2019-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多