我在将多个excel文件加载到数据库表之前验证它们。
首先,我想检查NULL
,确保文件中有效行数的阈值条件符合 60%
标记;如果条件低于 60%
,请拒绝该文件并向其发送60%及以上的邮件通知,处理该文件,将数据加载到表中并发送邮件通知。以下是清晰度的示例测试数据。在此示例数据中,以下是验证标准
ID无法 NULL
,创建一个标记为NULL的新列
如果(Non-NULL row count / total row count) < 60%
,则发送错误通知并拒绝文件
如果(Non-NULL row count / total row count) > 60%
,则将文件移至最终目的地并发送成功消息
ID Name
----- ------
1 John
2 Dave
NULL Jonny
NULL Kevin
NULL David
这应该被拒绝,因为它无法满足 60 percent
标准。
ID Name NULL_Flag Percent
----- ------ --------- -------
1 John N 40
2 Dave N 40
NULL Jonny Y 40
NULL Kevin Y 40
NULL David Y 40
ID Name
----- ------
100 Jack
200 Jill
300 Naomi
400 Tim
应该处理此文件,因为它符合 60 percent
标准,并且数据应该加载到目标表中。
ID Name NULL_Flag Percent
----- ------ --------- -------
100 Jack N 100
200 Jill N 100
300 Naomi N 100
400 Tim N 100
我应该如何在SSIS中解决这个问题?
答案 0 :(得分:1)
假设每个Excel文件具有相同的列布局,我将构建一个数据流来处理验证并设置一个布尔变量来控制如何处理任何特定文件。将数据流链接到后续任务的优先约束将在表达式中使用该布尔变量:
数据流将使用Excel源和脚本转换设置为目标:
脚本transfromation的代码SCR_DST_ValidateFile如下所示:
public class ScriptMain : UserComponent
{
private double _nullCount = 0;
private double _rowCount = 0;
public override void PreExecute()
{
base.PreExecute();
}
public override void PostExecute()
{
base.PostExecute();
Variables.ValidFile = ((_nullCount / _rowCount) > .6);
}
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
_rowCount += 1;
if (Row.ID_IsNull) _nullCount += 1;
}
}
其中ValidFile
是布尔变量的名称。
编辑:上面控制流程中的SEQ_Valid
和SEQ_NotValid
序列容器代表了处理特定要求所需的任何组件(例如,发送电子邮件,加载将文件的内容放入数据库等);我使用序列容器作为占位符。
至于设置优先约束,因此配置从DFT_CheckIfSpreadsheetValid
到SEQ_Valid
的约束:
从DFT_CheckIfSpreadsheetValid
到SEQ_NotValid
的约束配置如此: