我有一个带有数据流的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'获取到平面文件中吗?
答案 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:
答案 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)