我有一个看起来如下的包:
注意我用红色矩形标记的两个区域:它们在各方面都是相同的。我可以对包进行更改,以避免重复吗?在我看来,我无法将它们移动到数据流任务,因为那里不存在循环和文件系统任务。
答案 0 :(得分:0)
只需将来自“select batch logins”任务的查询放入记录集,然后在该记录集上创建另一个foreach循环,从变量执行这两个查询。 我可以看到,在你的第二个foreach循环中有一些额外的任务,所以你将它们以某种方式将它们合并到“选择所有批处理登录”任务,或者制作在两个循环中都匹配的约束。
答案 1 :(得分:0)
另一种方法是添加一个'动作'列到您的批次'表。 (或添加支腿表)。预先计算 您要对记录执行的操作。然后只删除一次记录和文件。
您好像在这里进行RBAR操作。
因此,例如,您针对表运行几个UPDATE语句,使表处于每个记录被标记为删除的状态。
之后,您将完成循环并根据表格中的内容进行删除。
它会使你的包更简单。你可以加入一些“提交”#39;确保记录和文件始终同时删除的逻辑。
答案 2 :(得分:0)
你可以像@Bill提到的那样为循环逻辑创建一个子包,并且“将查询的结果集传递给另一个包”的方法如下(使用SSIS 2012作为示例,我做了类似的工作SSIS 2005,所以你只需要将c#代码更改为vb.net)
在父包中,创建一个变量以保存父包中 resultSet 变量的名称:
在子包中,创建一个字符串变量 parentResultSetName :
在子包中,添加包配置以将 parentResultSetName 映射到父包变量 resultSetVariableName :
现在,我们可以通过子包的脚本任务中的名称读取 resultSet 变量:
public void Main()
{
// TODO: Add your code here
var dsName = Dts.Variables["parentResultSetName"].Value.ToString();
Variables variables = null;
DataSet resultSet = null;
Dts.VariableDispenser.LockForRead(dsName);
Dts.VariableDispenser.GetVariables(ref variables);
try
{
resultSet = variables[dsName].Value as DataSet;
if (resultSet != null)
{
MessageBox.Show("Sub package get: " + resultSet.Tables[0].Rows[0][0].ToString());
}
Dts.TaskResult = (int)ScriptResults.Success;
}
catch (Exception e)
{
Dts.Events.FireError(-1, "", e.Message, "", 0);
}
}
结果如下: