【问题标题】:Redirect NULL or blank values from Flat File从平面文件重定向 NULL 或空白值
【发布时间】:2016-04-14 18:27:18
【问题描述】:

我正在将来自平面文件源的记录导入到一个 SQL 表中,该表有 4 个不接受 NULL 值的列。我想做的是将包含特定 4 个字段的 NULL 或空白值的记录重定向到平面文件目标。

下面可以看到表格配置:

这是来自我的平面文件源的示例,其中我已将第一条记录中的县代码、第二条记录中的 UCN 和第三条记录中的 action_id 删除。

如果我按照当前配置运行我的包,它会由于限制而出错:

The column status returned was: "The value violated the integrity constraints for the column.". 

所以我的问题是如何重定向这些行?我认为我应该进行有条件的拆分,但我不确定,而且我也不知道如何配置它。到目前为止,我的尝试都是徒劳的。

有什么建议吗?

【问题讨论】:

    标签: sql-server ssis ssis-2012


    【解决方案1】:

    在您的平面文件源之后添加派生列转换。在那里您将测试不可为空的列是否为空。

    为了便于调试,我会为每个有问题的列添加一个标志。

    null_timestamp (ISNULL(timestamp) || LEN(RTRIM(timestamp)) == 0) ? true : false

    这样的表达式将确定平面文件中的列是否为空或修剪后的长度是否为零。

    一旦你测试了你的标志,你就可以添加一个条件拆分。条件拆分基于布尔表达式路由行。我会向它添加一个 Bad Data 输出并使用像

    这样的表达式
    null_timestamp || null_country_code || null_etc
    

    因为它们是布尔值,如果我们将这些值组合在一起(如果其中任何一个为真),则整个表达式变为真,并且行被路由到错误的数据路径。

    【讨论】:

    • 感谢@billinkc - 在对 LEN 函数进行小幅修改以将日期时间列转换为文本后,该解决方案运行良好。
    【解决方案2】:

    我只需添加一个条件拆分并相应地命名输出:

    【讨论】:

    • 我确实喜欢这种方法 - 但是您将如何表达 datetime 和 int 的条件?我似乎无法让该表达式评估为真。
    • 应该可以使用简单的类型转换,例如以下(使用上述类型的派生列): LEN(REPLACENULL((DT_WSTR, 100)[Derived Column 1],"") ) == 0
    【解决方案3】:

    您能否先将数据加载到临时表,然后对临时表使用 2 个单独的查询,或者插入到您的表中,或者写出到平面文件?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-25
      • 2018-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多