11

我有一个带有数据流的 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”放入平面文件中?

4

6 回答 6

11

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

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

我希望这会有所帮助!

于 2010-05-20T17:42:38.893 回答
9

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

于 2010-05-20T14:59:55.330 回答
4

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

在此处输入图像描述

于 2015-03-23T02:54:36.993 回答
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 等。

于 2010-05-20T19:48:32.853 回答
0

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

或替代方法是使用 vb 脚本

在此处输入图像描述

在此处输入图像描述

于 2021-03-29T18:11:46.777 回答
0

最终我最终做的是使用该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 中对文本进行转码比它有任何权利更令人讨厌

于 2021-11-04T16:00:51.740 回答