我可以根据查询在SSIS for循环中设置变量吗?

时间:2017-02-21 18:39:45

标签: sql-server ssis

我有一个在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

基本上,我试图避免不得不写一千次我的第一个选择陈述。

谢谢。

如果我说的话没有意义,请告诉我,以便我再详细说明。

2 个答案:

答案 0 :(得分:8)

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

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

SELECT Param1, Param2
FROM ThisTable
WHERE SomeID = 1;

我已经嘲笑了SQLStatement,但其他一切看起来应该是这样的(不要忘记检查它是否有完整的数据集): enter image description here

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

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

循环属性: enter image description here

在foreach循环中分配变量: enter image description here

现在在dataflow任务中创建数据源,添加查询并将其参数化为: enter image description here enter image description here

最后,它看起来应该是那样的(红色突出显示的是数据流任务的内部组件): enter image description here

当然,你必须添加一些日志记录或其他一些组件,但这是基本的,会让你感动。

答案 1 :(得分:0)

您还可以查看SSIS工具" For Loop Container"和" Foreach循环。

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

enter image description here