如何让SSIS数据流将'0.00'放在平面文件中?

时间:2010-05-19 18:41:15

标签: ssis flat-file dataflow dataflowtask

我有一个带有数据流的SSIS包,它接受一个ADO.NET数据源(只是一个小表),执行一个select *查询,并将查询结果输出到一个平面文件(我也尝试过拉整个表并没有使用SQL select)。

问题是数据源拉出了一个Money数据类型的列,如果该值不为零,它就会很好地进入文本平面文件(如'123.45'),但是当值为零时,它在目标平面文件中显示为“.00”。我需要知道如何将前导零回到平面文件中。

我已尝试输出的各种数据类型(在Flat File Connection Manager中),包括货币和字符串,但这似乎没有效果。

我在我的选择中尝试过一个case语句,如下所示:

  CASE WHEN columnValue = 0 THEN 
     '0.00' 
  ELSE 
      columnValue 
  END

(仍然导致'.00')

我尝试过这样的变体:

 CASE WHEN columnValue = 0 THEN
     convert(decimal(12,2), '0.00') 
 ELSE 
     convert(decimal(12,2), columnValue) 
 END

(仍然导致'.00')

 CASE WHEN columnValue = 0 THEN
     convert(money, '0.00') 
 ELSE 
     convert(money, columnValue) 
 END

(结果为'.0000000000000000000')

这个愚蠢的小问题就是杀了我。任何人都可以告诉我如何将零Money数据类型数据库值作为'0.00'获取到平面文件中吗?

5 个答案:

答案 0 :(得分:9)

您可以使用派生列更改值的格式吗?你试过吗?

答案 1 :(得分:8)

我遇到了完全相同的问题,而soo的回答对我有用。我将数据发送到派生列转换(在数据流转换工具箱中)。我将派生列添加为数据类型Unicode String([DT_WSTR])的新列,并使用以下表达式:

价格< 1? “0”+(DT_WSTR,6)价格:(DT_WSTR,6)价格

我希望有所帮助!

答案 2 :(得分:3)

我使用高级编辑器将列从double-precision float更改为decimal,然后将Scale设置为2:

enter image description here

答案 3 :(得分:1)

由于您要导出到文本文件,只需导出预先格式化的数据。

您可以在查询中执行此操作,也可以创建派生列,无论您更熟悉它。

我选择将列宽15个字符。如果你导入到一个期望数字的系统中那些零应该被忽略...那么为什么不标准化字段长度呢?

SQL中的一个简单解决方案如下:

    select 
    cast(0.00 as money) as col1
    ,cast(0.00 as numeric(18,2)) as col2 
    ,right('000000000000000' + cast( 0.00 as varchar(10)), 15) as col3
    go

 col1                  col2                 col3
 --------------------- -------------------- ---------------
                 .0000                  .00 000000000000.00

只需将'0.00'替换为您的列名,不要忘记添加FROM table_name等。

答案 4 :(得分:0)

使用派生列好,也需要检查条件
pricecheck <=0 ? "0" + (DT_WSTR,10)pricecheck : (DT_WSTR,10)pricecheck

或者替代方法是使用 vb 脚本

enter image description here

enter image description here