You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SSIS导出CSV时decimal(18,2)类型0.00值前导零丢失问题求助

解决SSIS导出decimal(18,2)到CSV时0.00变为.00的问题

我之前处理过一模一样的SSIS导出CSV格式问题,给你几个亲测有效的方案,按优先级试试:

方案1:直接配置平面文件连接管理器(最简单)

不用折腾数据转换,直接在平面文件连接管理器里设置列的输出格式:

  • 打开你的平面文件连接管理器,切换到高级选项卡
  • 找到对应的Price列,把数据类型改成DT_WSTR(或者DT_STR,根据编码需求选),输出列宽度设为20足够用
  • 在格式字段里输入0.00,这个格式会强制数值显示前导零+两位小数
  • 保存配置后重新运行数据流,0.00就能正确输出成0.00,其他数值比如7.56也会保持两位小数

方案2:修正派生列表达式(解决之前的转换错误)

你之前用的表达式报错是因为逻辑判断和类型转换的问题,调整后的表达式能正确处理所有场景:

[Price] < 1 && [Price] >= 0 ? "0" + (DT_WSTR, 18)[Price] : 
[Price] > -1 && [Price] < 0 ? "-0" + (DT_WSTR, 18)(-1 * [Price]) : 
(DT_WSTR, 18)[Price]

逻辑说明:

  • 当数值在[0,1)区间时,给.00前面加"0",变成0.00
  • 当数值在(-1,0)区间时,处理成-0.xx的格式
  • 大于等于1或小于等于-1的数值,直接转字符串保留原有格式

注意:确保派生列的输出类型是DT_WSTR,长度设为20,避免截断。

方案3:用脚本组件处理(最灵活)

如果上面的方案都不行,脚本组件能完全自定义格式:

  1. 在数据流中添加脚本组件,选择「转换」模式
  2. 在输入列里勾选你的Price列(decimal类型)
  3. 添加一个新的输出列,命名比如FormattedPrice,类型选DT_WSTR,长度设为20
  4. 打开脚本编辑器,用C#编写处理逻辑:
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
    if (!Row.Price_IsNull)
    {
        decimal priceValue = Row.Price;
        // 强制格式化保留两位小数,自动补前导零
        Row.FormattedPrice = priceValue.ToString("0.00");
    }
    else
    {
        // 空值按需求处理,比如输出空字符串或者特定标记
        Row.FormattedPrice = string.Empty;
    }
}
  1. 把脚本组件的FormattedPrice列映射到平面文件目标的对应列即可

为什么DT_CY不行?

你提到转DT_CY后数据查看器显示0.0000,但导出后变成0,这是因为DT_CY是货币类型,SSIS默认导出货币值时会省略小数位当值为0,所以这个类型不适合用来保留固定两位小数的场景。

内容的提问来源于stack exchange,提问作者Rob Tyketto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 19:38:11