注意SSIS中的DT_NUMERIC类型转换为字符类型(比如DT_WSTR)时,会截断小数点前的0
我们知道SSIS中有许多数据类型,如下图所示:
但是DT_NUMERIC这个类型有个陷进要注意,我们来做个实验,随便定义一个String类型的SSIS包变量,然后打开该变量表达式窗口:
在变量表达式窗口中,首先我们将一个小数0.05转换为DT_NUMERIC(DT_NUMERIC, 8, 2)类型,然后再将其转换为DT_WSTR(DT_WSTR, 20)类型,然后点击左下方的Evaluate Expression按钮,然后看看Evaluated Value文本框的结果,如下图所示:
(DT_WSTR, 20) (DT_NUMERIC, 8, 2) 0.05
我们发现小数0.05最后居然输出的字符串是.05整数部分的0消失了。。。
我们再来试试-0.05的计算结果,如下图所示:
(DT_WSTR, 20) (DT_NUMERIC, 8, 2) -0.05
同样-0.05最后输出的字符串是-.05整数部分的0也消失了。。。
这是因为在SSIS中如果将DT_NUMERIC类型直接转换为诸如DT_WSTR这样的字符串类型,会将绝对值小于1的小数(比如0.2,0.3, -0.8等)整数位截取掉。
如果要将DT_NUMERIC转换为DT_WSTR这样的字符串类型,必须要先将DT_NUMERIC转换为DT_DECIMAL,然后再转换为字符串类型DT_WSTR,这样就不会出现本文所述的小数整数截断问题。
例如我们将0.05先转换为DT_NUMERIC(DT_NUMERIC, 8, 2)类型,然后再转换为DT_DECIMAL (DT_DECIMAL, 2)类型,最后转换为DT_WSTR(DT_WSTR, 20)类型,如下图所示:
(DT_WSTR, 20) (DT_DECIMAL, 2) (DT_NUMERIC, 8, 2) 0.05
现在小数0.05就完整的显示出来了。
所以当DT_NUMERIC类型转换为诸如DT_WSTR这样的字符串类型时要当心,必须要将其先转换为DT_DECIMAL类型,再转换为DT_WSTR这样的字符串类型,避免小数点前的0被截断。虽然我也不知道为什么SSIS有这么一个莫名其妙的问题,但是目前来看只有通过先将DT_NUMERIC类型转换为DT_DECIMAL类型才能解决这个问题。尤其是在某些SSIS数据流任务(Data Flow Task)中用到了DT_NUMERIC类型要特别当心,因为数据流的目标有时候会将DT_NUMERIC类型直接转换为DT_WSTR这样的字符串类型,那么你会发现数据流目标输出的文件中,小数点前的0可能全部都没有。。。要在数据流任务中使用派生列(Derived Column)组件或数据类型转换(Data Conversion)组件,先将DT_NUMERIC类型转换为DT_DECIMAL类型,再输出到数据流目标文件,才能保证目标文件中的小数正确显示。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架