查询2将基于Query1输出运行

时间:2014-09-18 12:33:55

标签: ssis

执行SQL任务将为我们提供数据库列表。基于列表,Query2应该在所有数据库上运行。

Query1结果:

databasename1
databasename2 
databasename3

查询2:

第1步

select * from databasename1.dbo.tablename

第2步

select * from databasename2.dbo.tablename

第3步

select * from databasename3.dbo.tablename

如何使用查询结果为后续查询提供支持?在我的例子中,更改目录名称

1 个答案:

答案 0 :(得分:2)

您可以使用Foreach Loop Container

来完成此操作

您需要以下控制流程:

Execute SQL Task -> Foreach Loop Container和容器内的另一个Execute SQL Task

您需要两个变量:

  • DatabaseList(Object)
  • DatabaseName(String)

使用SQL任务列出数据库

  • 使用Object类型(DatabaseList)
  • 创建用户变量
  • General窗格中,将ResultSet媒体资源设为Full result set
  • Result Set窗格中设置添加新行(Result Name = 0, Variable Name = User::DatabaseList

这将查询数据库并将列表存储在对象中。

注意第一个Execute SQL Task查询中的一条记录中应该有一个数据库名称。每条记录都将由Foreach循环处理。

Foreach Loop Container

之后添加SQL Command Task
  • Collection窗格中,将Enumerator设置为Foreach ADO Enumerator
  • 选择User::DatabaseList作为ADO object source variable
  • Variable Mappings窗格中添加新条目(Variable = User::DatabaseName, Index = 0

Execute SQL Task 中添加Foreach Loop Container并正常设置。

  • ResultSet窗格上将None属性设置为General
  • 将查询复制到clipoard。

突出显示Container内的SQL任务,然后按F4 (打开属性选项卡)。

添加一个设置SqlStatementSource属性的新表达式。当Expression添加一个表达式,该表达式返回数据库的查询(基于User :: DatabaseName)。

您可以使用表达式动态设置对象的某些属性。 (此方法也适用于Data Flow Task只需要设置的属性(使用表达式)可能不同)

注意如果要使用DFT,那么表应该具有相同的结构(查询返回的列的元数据在SSIS中应该相同)