SSIS - 动态循环遍历多个数据库

时间:2018-01-30 15:38:16

标签: sql-server ssis etl dynamic-sql

我必须在一个独特的数据库中整合来自1000多个具有相同结构/表的数据库中的数据。 可以每天添加和删除DB,因此我需要动态检索DB列表并运行动态生成的SQL查询以提取每个数据库的数据。

我使用来自变量的查询来设计数据流,如果使用静态值执行该变量,该变量工作正常:

enter image description here

使用SQL任务我获取实例列表,我循环遍历它们并使用嵌套的Foreach循环/ SQL任务检索数据库名称并使用以下语句创建动态SQL(DB名称是匿名的):< / p>

选择'select'''+ name +'''作为DatabaseName,ID来自'+ name +'。[dbo]。[Orders] as querytext FROM sys.databases WHERE name LIKE('XXX%_ %');

这部分也正常工作:

enter image description here

如何使用SQL任务“执行SQL任务 - 获取查询文本”的结果作为要在源“OLE DB源1”(“数据流任务3”的一部分)中执行的查询?

我尝试在SQL任务的结果集中映射Object变量“User :: SqlCommandFromSQLTask”,然后将其设置为ADO对象源变量,并使用Script任务将其转换为字符串并将值传递给变量SqlStringFromSQLTask3 (在“OLE DB Source 1”中用作源代码)但是我收到错误违反PRIMARY KEY约束,就好像数据流始终以我设置为默认值的静态值运行:

enter image description here

enter image description here

enter image description here

但是,如果我从变量面板中删除了值,则会收到错误“没有为命令对象设置命令文本。”,甚至将数据流的属性DelayValidation更改为false。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

当我使用SSIS连接到多个SQL Server盒时,我已将这些SQL Server连接字符串存储在中央数据库的表中。然后,我将该表的查询用作foreach循环数据流任务的输入。如果必须更改sql server连接字符串(确实发生),我们只需使用最新值更新该表即可。