【问题标题】:How do I get SSIS Data Flow to put '0.00' in a flat file?如何让 SSIS 数据流将“0.00”放入平面文件中?
【发布时间】:2011-02-21 12:56:23
【问题描述】:

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

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

我尝试了各种输出数据类型(在平面文件连接管理器中),包括货币和字符串,但这似乎没有效果。

我在我的选择中尝试了一个 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”放入平面文件中?

【问题讨论】:

  • 我很想知道这个问题的原因 - 我对 Derived Column hack 不太满意。

标签: ssis flat-file dataflow dataflowtask


【解决方案1】:

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

价格

希望对你有帮助!

【讨论】:

  • 感谢 user346389... 包含奇怪的 SSIS 派生列表达式语法很有帮助。
  • 只关心负数。 -0.25 将从数字转换为 -.25 到 DT_WSTR。你可以使用类似于[Price] < 1 ? ([Price] >= 0 ? "0" + (DT_WSTR,18)[Price] : [Price] > -1 ? "-0" + (DT_WSTR,18)(-1 * [Price]) : (DT_WSTR,18)[Price]) : (DT_WSTR,18)[Price]
【解决方案2】:

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

【讨论】:

  • 好的,经过一番折腾(将数字转换为字符串),成功了。谢谢苏!
【解决方案3】:

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

【讨论】:

  • 用这种方法截断小数部分的零
【解决方案4】:

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

您可以在查询中执行此操作或创建派生列,无论您更喜欢什么。

我选择将列设置为 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 等。

【讨论】:

    【解决方案5】:

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

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

    【讨论】:

      【解决方案6】:

      我最终做的是使用FORMAT() 函数。

      CAST(FORMAT(balance, '0000000000.0000') AS varchar(30)) AS "balance"
      

      由于 SQL Server 实现该功能的方式,这确实对 CPU 性能产生了一些显着影响(通常至少一个数量级),但对我来说没有什么比这更容易、更正确或更一致.我使用的行数少于 100,000 行,并且包每小时执行不超过一次。在我的情况下,从 100 毫秒到 1000 毫秒并不是什么大问题。

      FORMAT() 函数默认返回 nvarchar(4000),因此我还将它转换回适当大小的 varchar,因为我的输出文件需要采用 Windows-1252 编码。在 SSIS 中对文本进行转码很多比它有任何权利更令人讨厌。

      【讨论】:

        猜你喜欢
        • 2010-10-25
        • 2013-05-02
        • 1970-01-01
        • 1970-01-01
        • 2012-05-04
        • 2023-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多