【问题标题】:Can I set variables in an SSIS for loop based on a query?我可以根据查询在 SSIS for 循环中设置变量吗?
【发布时间】:2017-02-21 18:39:44
【问题描述】:

我有一个在 SSIS 中执行的 SQL 查询,用于将数据加载到如下所示的 CSV 文件中:

SELECT *
FROM SomeTable
WHERE SomeDate BETWEEN '1-Jan-2016' AND '31-Dec-2016'
      AND Param1 = 2 AND Param2 = 2

在 QlikView 中编写时,我使用了如下参数:

SELECT *
FROM SomeTable
WHERE SomeDate BETWEEN '1-Jan-2016' AND '31-Dec-2016'
      AND Param1 = $(Param1) AND Param2 = $(Param2)

现在我正在将整个任务迁移到 SSIS,我正在研究如何获取它,以便动态分配 Param1 和 Param2。例如,在 QlikView 中,我创建了一个由另一个查询填充的表:

SELECT Param1, Param2
FROM ThisTable
WHERE SomeID = 1

类似的东西。从该查询中选择 Param1Param2 可以让我在 QlikView 代码中获得 $(Param1)$(Param2) 的必要值。

我现在正尝试将我的 QlikView 代码转换为 SSIS 包,因为 SSIS 是专用的 ETL 工具,而 QlikView 不是。我正在做的事情可能吗?如果是这样,我将如何去做?

我的想法是将它全部包装在一个 for 循环容器中,并在它从该查询中获取最后一个 Param1Param2 后停止:

SELECT Param1, Param2
FROM ThisTable
WHERE SomeID = 1

基本上,我试图避免将我的第一个 select 语句写一千遍。

谢谢。

如果我说的没有道理,请告诉我,以便我能详细说明。

【问题讨论】:

    标签: sql-server ssis


    【解决方案1】:

    我怀疑您正在执行 SQL 任务,因此,您只需在 SQL 任务组件中映射参数即可。

    您必须首先创建一个执行此查询的 SQL 组件:

    SELECT Param1, Param2
    FROM ThisTable
    WHERE SomeID = 1;
    

    我已经模拟了 SQLStatement,但其他一切都应该是这样的(不要忘记检查它是否有完整的数据集):

    然后将结果集放入对象变量中(只需确保结果名称为 0):

    现在为了对上面收集的每个值运行以下查询,我们可以使用 foreach 循环并迭代我们的数据集。在这个 foreach 循环中,我们将放置一个数据流任务,您将使用 OLE DB 作为源和平面文件作为目标,以便读取数据并将其放入 csv 文件。 (在实际项目中,我建议使用 ODBC 而不是 OLE DB,它更快)。

    循环属性:

    在 foreach 循环中分配变量:

    现在在数据流任务中创建您的数据源,添加查询并将其参数化,如下所示:

    最后它应该看起来像这样(红色突出显示的是数据流任务的内部组件):

    当然,您必须添加一些日志记录或其他一些组件,但这是基本的,会让您继续前进。

    【讨论】:

    • 我实际上正在使用包含 OLE DB 源 -> 平面文件目标的数据流任务。您的方法是否允许我将结果集保存为 CSV?
    • 是的,确实如此。我会修改我的答案更详细
    • 终于开始实施了,效果很好,谢谢!
    • 如果您还在这里,只是一个后续问题。为什么我必须为完整的结果集使用 0?
    • @Leon 起初我使用了一些随机名称,但没有成功。我会说0表示它是sql语句带来的第一个结果集。如果您的陈述不会带来很少的结果,您可以使用 0、1、2 等来指明哪个是...
    【解决方案2】:

    您还可以查看 SSIS 工具“For 循环容器”和“Foreach 循环”。

    您使用值列表填充参数类型对象 - 在我的例子中,我在 SQL 任务 [查找缺少的订单] 中使用了一个查询。然后【Foreach Order Loop】任务遍历参数中的每一项,执行【Load missing Orders】数据流任务:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-05
      • 1970-01-01
      • 1970-01-01
      • 2018-02-10
      • 2014-05-05
      • 2014-05-22
      • 2015-05-29
      • 1970-01-01
      相关资源
      最近更新 更多