0

在将它们加载到数据库表之前,我正在验证多个 excel 文件。

首先,我要检查NULL,确保文件中有效行数的阈值标准符合60%标记;如果标准低于60%,拒绝文件并发送邮件通知,否则 60% 及以上,处理文件,将数据加载到表中并发送邮件通知。为了清楚起见,下面是一个示例测试数据。在此示例数据中,以下是验证标准

  1. ID 不能NULL,创建一个标记为 NULL 的新列

  2. 如果(Non-NULL row count / total row count) < 60%,则发送错误通知并拒绝文件

  3. 如果(Non-NULL row count / total row count) > 60%,则将文件移动到最终目的地并发送成功消息

示例输入文件 1:

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

示例输入文件 2:

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 中解决这个问题?

4

1 回答 1

1

假设每个 Excel 文件具有相同的列布局,我将构建一个数据流来处理验证并设置一个布尔变量来控制如何处理任何特定文件。将数据流链接到后续任务的优先约束将在表达式中使用该布尔变量:

控制流截图

数据流将使用 Excel 源和脚本转换集作为目标:

数据流截图

脚本转换的代码 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_ValidSEQ_NotValid序列容器代表您可能需要处理您的特定要求的任何组件(例如,发送电子邮件,将文件的内容加载到数据库中等);我使用序列容器作为占位符。

至于设置优先约束,从DFT_CheckIfSpreadsheetValidto的约束SEQ_Valid是这样配置的:

@ValidFile 优先约束的截图

DFT_CheckIfSpreadsheetValidto的约束SEQ_NotValid是这样配置的:

!@ValidFile 优先约束的屏幕截图

于 2013-02-21T21:42:21.043 回答