【问题标题】:SSIS Package to loop through a table for Stored Procedure names and execute themSSIS 包循环遍历存储过程名称的表并执行它们
【发布时间】:2018-09-28 22:28:05
【问题描述】:

我创建了一个表,其中所有存储过程名称都保存在一列中。我目前正在使用“执行 SQL 任务”将这些名称作为“结果集”提取到对象变量 strProcs 中。

我需要遍历所有这些存储过程名称并以相同的顺序执行它们。如何使用 ForEach 循环容器或其他优雅的解决方案来实现这一点?感谢您的帮助。

【问题讨论】:

  • 这些程序需要额外的输入或输出参数吗?
  • 如果您需要它们按顺序执行,您需要添加一个类似SortOrder 的列,并在您的迭代器中使用该值。根据定义,表本身是一个无序集,并且您检索数据的查询不能保证在任何特定的运行中以任何特定的顺序返回列表。

标签: sql-server ssis


【解决方案1】:

首先,创建一个字符串变量,比如说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。点击确定。

然后你就完成并准备测试了。

【讨论】:

  • 谢谢亚伦。这是极好的。我不知道如何创建动态 SQL 查询。帮了我很多。正如 Eric 所提到的,我将按顺序运行查询(大约 200 个存储过程),并且表中确实有一个“ID 号”字段。我是否有可能更新开始时间、执行程序并将结束时间更新回数据库?从新手的角度来看,似乎“脚本任务”是唯一的方法:)。你能帮我扩展这部分吗?谢谢。
  • 是的,您绝对可以做到这一点,而且您不需要脚本任务来做到这一点。正如我在编辑的答案中解释的那样,您可以扩展您的执行 SQL 任务以执行 UPDATEs。
  • 谢谢亚伦。非常适合我。我以不同的方式完成了这项工作。但这更优雅:)。再次感谢。
  • 嘿,如果你学会了两种做某事的新方法,我会说这是一个胜利!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多