我有一个如下所示的包:
注意我用红色矩形标记的两个区域:它们在各个方面都是相同的。我可以对包进行更改以避免这种重复吗?在我看来,我无法将它们移动到数据流任务,因为那里不存在循环和文件系统任务。
我有一个如下所示的包:
注意我用红色矩形标记的两个区域:它们在各个方面都是相同的。我可以对包进行更改以避免这种重复吗?在我看来,我无法将它们移动到数据流任务,因为那里不存在循环和文件系统任务。
您可以像@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);
}
}
结果如下:
另一种方法是在“批次”表中添加“操作”列。(或添加一个支腿表)。事先确定你想对记录做什么。然后只需删除一次记录和文件。
看起来你在这里做RBAR操作。
因此,例如,您对您的表运行几个 UPDATE 语句,这些语句使表处于每条记录都被标记为删除或不删除的状态。
然后,您通过循环并根据表中的内容进行删除。
它会让你的包裹更简单。并且您可以合并一些“提交”逻辑,以确保始终同时删除记录和文件。
只需将您的查询从“选择批量登录”任务放到记录集,然后在该记录集上进行另一个 foreach 循环,从变量执行这两个查询。我可以看到在您的第二个 foreach 循环中还有一些额外的任务,因此您将以某种方式将它们合并到“选择所有批量登录”任务中,或者使约束在两个循环中都匹配。