这是执行此操作的一种方法。该示例使用带有 SQL Server 2012 后端的 SSIS 2008 R2。
创建一个表来存储您的参数值。假设表名是dbo.SProcValues。根据您的存储过程定义,表架构将如下所示。
CREATE TABLE dbo.SProcValues(
Id int IDENTITY(1,1) NOT NULL,
SProcName nvarchar(40) NOT NULL,
SchemaName nvarchar(20) NOT NULL,
Dimension nvarchar(40) NOT NULL,
ETLSchema nvarchar(20) NOT NULL,
ETLTable nvarchar(40) NOT NULL,
IsExecute bit NOT NULL
)
GO
让我们使用以下脚本插入一些示例数据。
INSERT INTO dbo.SProcValues
(SProcName, SchemaName, Dimension, ETLSchema, ETLTable, IsExecute) VALUES
('dbo.sp_generate_merge', 'dim1', 'dimension1', 'stg1', 'table1', 1),
('dbo.sp_generate_merge_scdbk', 'dim2', 'dimension2', 'stg2', 'table2', 1),
('dbo.sp_generate_merge_scdbk', 'dim3', 'dimension3', 'stg3', 'table3', 0),
('dbo.sp_generate_merge', 'dim4', 'dimension4', 'stg4', 'table4', 0);
GO
在 SSIS 包上,假设您已经建立了数据源和连接管理器。创建以下变量。变量SProcValues将保存我们存储在上述表格中的参数集。变量SQLInnerQuery将保存稍后将在内部执行 SQL 任务中使用的查询。其他变量与表中可用的每一列相关,因此我们可以遍历每一行并将其保存在变量中。
将以下查询粘贴到变量SQLGetParameters的值中
SELECT SProcName, SchemaName, Dimension, ETLSchema, ETLTable, IsExecute FROM dbo.SProcValues
选择变量SQLInnerQuery并按 F4 查看属性。将属性EvaluateAsExpression设置为True,然后在Expression属性上单击省略号按钮。
我们需要设置一个表达式来计算 EXEC 存储过程语句,该语句稍后可以提供给内部执行 SQL 任务。设置以下表达式。
"EXEC " + @[User::SProcName] + " @Schema = ?, @Dimension = ?, @ETLSchema = ?, @ETLTable = ?, @IsExecute = ?"
如果您单击编辑器上的 Evaluate Expression 按钮,您可以看到表达式的计算结果。您还会注意到下面的屏幕截图中没有存储过程名称,这是因为包变量 SProcName 当前没有任何值。在运行期间,SProcName 将被分配表中的值,并且此表达式将自动解析自身。
在 SSIS 包上,拖放一个执行 SQL 任务。此任务将运行以下查询以获取存储在表 dbo.SProcValues 中的参数值列表。在执行 SQL 任务上配置常规页面,如下所示。该示例使用 OLEDB 连接,连接管理器/数据源被命名为 Practice。
配置执行 SQL 任务的结果集页面,将查询的结果集存储到对象变量中。
现在第一个 Execute SQL Task 已配置为获取应传递给存储过程的参数值列表,您需要遍历记录。
拖放一个 Foreach 循环容器。将执行 SQL 任务的优先级容器连接到 Foreach 循环容器。配置 Foreach 循环容器的 Collection 页面,如下所示。我们正在使用 ADO 枚举器遍历结果集。
在 Foreach 循环容器上配置变量映射页面,如下所示。当我们遍历每一行时,我们将列值存储在各个变量中,以便我们可以将其传递给下一个执行 SQL 任务以运行存储过程。
在 Foreach 循环容器中拖放一个 Execute SQL 任务,这样每次我们遍历结果集中的一行时都会执行该任务。如下所示配置执行 SQL 任务。
笔记
您可能希望根据您的要求在第二个执行 SQL 任务上配置ResultSet属性。如果选择 ResultSet,则需要配置适当的对象变量来接受结果集。对于本示例,我将其保留为None 。
配置要作为参数传递给存储过程的值。
最后,控制流看起来像这样。
当程序包运行时,循环将针对上述 SELECT 查询返回的尽可能多的记录执行存储过程,前提是您已将表行中定义的所有存储过程在数据库中可用。我已经创建了存储过程dbo.sp_generate_merge_scdbk
并dbo.sp_generate_merge
具有相同的参数定义。这就是包成功执行的原因。