【问题标题】:How to make SSIS truncate numeric field in Flat File Destination如何使 SSIS 截断平面文件目标中的数字字段
【发布时间】:2015-07-08 11:21:36
【问题描述】:

我想要一些关于在 SSIS 中处理截断问题的建议。我在表格中有一个列 Col1,它是 MONEY。我想将它输出到一个文本文件(固定宽度,右不规则)。在输出文件中,包含 Col1 的列只能是 8 个字符宽。

在 OLEDB 数据源中,Col1 在“外部列”和“输出列”选项卡中均指定为:
currency [DT_CY]

在平面文件连接管理器的高级选项卡中,将 Col1 指定为:
currency [DT_CY]InputColumnWidth 设置为 8。

如果我用 123456789.00 填充 Col1 并执行任务,OLEDB 源成功并将行传递到目标,但任务失败:

错误:0xC02020A1 在 DFT_Test,FFDEST_Test [3955]:数据转换 失败的。 “Col1”列的数据转换返回状态值 4 和状态文本“文本被截断或一个或多个字符没有 在目标代码页中匹配。”。

错误:DFT_Test 处出现 0xC02020A0, FFDEST_Test [3955]:无法复制或转换列的平面文件数据 “Col1”。

我想避免这些截断错误。在源的错误输出中,我将 Col1 的截断属性从 Fail Component 更改为 Ignore Failure。我原以为这会解决问题,但执行任务仍然会出现同样的错误。

有人可以就如何使 SSIS 简单地将列截断为 8 个字符提供一些指导吗?

【问题讨论】:

    标签: sql-server ssis


    【解决方案1】:

    使用Derived Column 任务创建一个包含8 个字符的列,并从money 列填充它。然后在 Destination 组件中,将 Derived Column 映射到 Col1 Destination 而不是原始列。

    或者,更好的是,在您的源组件中,使用 SQL 查询将您的货币列转换为 varchar(8) 或 char(8) 列。

    【讨论】:

    • 我意识到可以在源组件中通过 T-SQL 实现这一点,但我所追求的是如何在 SSIS 中配置组件来做到这一点。在 DTS 中,复制列转换默认截断。
    • 在 SSIS 中,我们有派生列或数据转换转换。
    • 我意识到我可以使用 SSIS 中的数据转换转换将货币值转换为字符串,然后取最左边的 8 个字符。但是有几十个领域。要为每个人执行此操作,需要花费 很多 时间手动单击和输入公式。在 T-SQL 中,我可以在 Excel 中获取列名列表,创建公式,并在 内获取我需要进行转换的 SELECT 语句。我认为这是“在 T-SQL 中执行它,因为在 SSIS 中它是混乱/耗时/容易出错/不可能。”的另一种情况!
    • 如果你想学习BiML,你可以模拟excel只使用SSIS能做什么。
    • 这是个好建议。我用谷歌搜索了一下,看起来很有希望。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-04
    相关资源
    最近更新 更多