首先,创建一个字符串变量,比如说ProcName。当我们遍历循环时,这将保存存储的过程名称。
接下来,创建一个 Foreach 循环,将 Enumerator 设置为 Foreach ADO Enumerator,将源变量设置为 User::strProcs 对象变量。然后在左侧窗格的Variable Mappings 下,添加一个新条目,选择User::ProcName 并将索引设置为0(假设proc 名称是strProcs 的第一列)。
然后,在循环容器内添加一个Execute SQL Task。配置与您的数据库的连接,然后将SQLSourceType 设置为Direct input。对于SQLStatement,您将使用 ProcName 变量构建一个简单的动态查询。它看起来像这样:
DECLARE @ProcName VARCHAR(128) = ?
DECLARE @query VARCHAR(MAX) = 'EXEC ' + @ProcName
EXECUTE(@query)
点击OK 保存查询,然后转到左侧窗格中的Parameter Mapping。添加条目,设置变量名称为User::ProcName,方向为Input,数据类型为
VARCHAR,参数名称为 0,参数大小为 128。点击OK 保存Execute SQL Task 配置。
就是这样!请注意,这是对不包含参数的 proc 的简化说明。如果需要传递参数,则必须将它们添加到分配给 @query 变量的值中,以便它们与动态 sql 的其余部分一起执行。
编辑:
Ravi 问:“我将按顺序运行查询(大约 200 个存储过程),并且我的表中有一个“ID 号”字段。我是否有可能更新开始时间,执行程序和更新结束时间回到数据库?”
我假设您的数据库中有一个表,其中包含 ID、过程名称、LastStartTime 和 LastEndTime。而且我还将假设您在 SSIS 中设置的 ADO 记录具有 ID 值和 proc 名称,并且假设列也按此顺序排列。
使用您在上面创建的内容,您可以按照以下步骤修改一些任务并获得扩展的解决方案。
首先,创建一个 Int32 变量,我们称之为ProcID。接下来,我们将修改 Foreach 循环配置,以便将 ID 加载到 ProcID 中。右键单击循环容器并选择Edit。单击左侧窗格中的Variable Mappings 并在变量下添加User::ProcID 并将索引设置为0。将User::ProcName 的索引设置为1。点击OK 以保存对循环的更改。
接下来,您将修改执行动态 SQL 的 Execute SQL Task。所以打开那个配置编辑器,更新SQLStatement,让它看起来像这样:
DECLARE @ProcName VARCHAR(128) = ?
DECLARE @ProcID INT = ?
DECLARE @query VARCHAR(MAX) = 'EXEC ' + @ProcName
UPDATE ProcTable
SET LastStartTime = GETDATE()
WHERE ID = @ProcID
EXECUTE(@query)
UPDATE ProcTable
SET LastEndTime = GETDATE()
WHERE ID = @ProcID
您可以在 proc 调用之前 UPDATE 表,然后在 proc 调用之后再次。这里不需要脚本任务。
我们还将另一个变量映射到我们的 SQL 脚本中,因此在编辑 SQLStatement 后,单击左侧窗格中的 Parameter Mapping,点击 Add 按钮,然后选择 User::ProcID 作为变量名称,数据类型可以保持为LONG,设置参数名称为1,参数大小为-1。点击确定。
然后你就完成并准备测试了。