注意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類型,再輸出到數據流目標文件,才能保證目標文件中的小數正確顯示。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM