我创建了一个表,其中所有存储过程的名称都保存到一列中。我目前正在使用“ 执行SQL任务”将这些名称作为“结果集”提取到对象变量strProcs
中。
我需要遍历所有这些存储过程的名称,并以相同的顺序执行它们。如何使用ForEach循环容器或其他优雅的解决方案来实现此目的?谢谢您的帮助。
答案 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。点击确定。
然后您就可以完成测试了。