SSIS包可遍历存储过程名称的表并执行它们

时间:2018-09-27 16:23:07

标签: sql-server ssis

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

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

1 个答案:

答案 0 :(得分:3)

首先,创建一个字符串变量,假设为ProcName。当我们遍历循环时,它将保留存储的proc名称。

接下来,创建一个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,然后在Variable下添加User::ProcID,并将Index设置为0。将User::ProcName的Index设置为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

您可以UPDATE在proc调用之前SQLStatement,然后在proc调用之后再次Parameter Mapping。您无需在此处执行脚本任务。

我们还将另一个变量映射到我们的SQL脚本中,因此,在编辑Add之后,在左窗格中单击User::ProcID,点击LONG按钮,然后选择{ {1}}作为变量名称,数据类型可以保持为def brute_force(): msg = raw_input('Enter your text here: ') key = len(msg)/2 alphabets = 'ABC2&0346_+/*~DEFGHIJK(){";.<.>LMNOPQRST:?UVWXYZ!#$%' cipher = ' ' msg = msg.upper() for chars in msg: if chars in alphabets: sol = alphabets.find(chars) sol = sol + key if sol >= len(alphabets): sol = sol - len(alphabets) elif sol < 0: sol = sol + len(alphabets) cipher = cipher + alphabets[sol] else: cipher = cipher + chars print('Encrypted text {}'.format(cipher)) decrypt = cipher for key in range(len(alphabets)): dec_text = ' ' for alphas in decrypt: if alphas in alphabets: sol_dec = alphabets.find(alphas) sol_dec = sol_dec - key if sol_dec < 0: sol_dec = sol_dec + len(alphabets) dec_text = dec_text + alphabets[sol_dec] else: dec_text = dec_text + alphas print('key {} {}'.format(key, dec_text)) if (dec_text == msg): word = dec_text else: word = 'Couldnt find' print('Decrypted text is {}'.format(word)) brute_force() ,将“参数名称”设置为1,并将“参数大小”设置为-1。点击确定。

然后您就可以完成测试了。