在将数据加载到数据库之前,如何验证Excel列的NULL?

时间:2013-02-21 06:17:47

标签: ssis

我在将多个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%,则将文件移至最终目的地并发送成功消息

  4. 示例输入文件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中解决这个问题?

1 个答案:

答案 0 :(得分:1)

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

control flow screenshot

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

data flow screenshot

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

至于设置优先约束,因此配置从DFT_CheckIfSpreadsheetValidSEQ_Valid的约束:

screenshot of @ValidFile precedence constraint

DFT_CheckIfSpreadsheetValidSEQ_NotValid的约束配置如此:

screenshot of !@ValidFile precedence constraint