![](/img/trans.png)
[英]Lookup transformation between DB2 packed decimal and SQL Server DT_NUMERIC in SSIS
[英]DB2 numeric values shown with no decimal places, linked server in MS SQL
我對DB2數據庫運行查詢時遇到問題。 有些列的數值返回小數點后的小數位,例如,我有一個VPACKSP.VPTARA
字段,其中包含塔拉重量。
運行這樣的查詢
SELECT VPACKSP.VPTARA FROM VPACKSP WHERE VPACKSP.VPTEIL = 123456
返回值0,000
正確的值應該是0,880
運行數值相乘的查詢將返回正確的值,但要高出多個倍
SELECT VPACKSP.VPTARA * 100 FROM VPACKSP WHERE VPACKSP.VPTEIL = 123456
返回值
88,000
使用Windows Server上安裝的ODBC 64位ISeries訪問驅動程序版本13.00.01.0運行查詢。 我使用的客戶端是Microsoft SQL Server,其中使用ODBC的OLE DB提供程序創建了鏈接服務器。
實際查詢如下所示:
SELECT
*
FROM OPENQUERY(
[LINKEDSERVERNAME]
,'SELECT VPACKSP.VPTARA FROM VPACKSP WHERE VPACKSP.VPTEIL = 123456'
)
;
並非所有數字列都發生這種情況。 我試圖將其轉換為NUMERIC(32,16)
以及DECIMAL(10,5)
,以及其他小數位組合,但所有結果均為零,僅乘法有效。 有什么可能是錯的嗎?
塞巴斯蒂安想到兩件事:
a)DB2中的DECIMAL數據類型,將值存儲為每位半個字節,在最右邊的半字節中加上十六進制C(表示正數)和十六進制D(表示負數)(如果是DECIMAL(4,3),則為0.880),以十六進制00 88 0C的形式存儲在三個字節中,小數點的位置保留在DBMS的元數據中。 因此,ODBC驅動程序可能會嚴重翻譯它。
b)同樣在ODBC層級別:驅動程序可能會遇到這樣的事實,在德國,您使用逗號而不是點作為小數點分隔符,並且驅動程序在找到一個不希望出現的字符時立即停止數字文字-您的逗號。
我將使用普通的ODBC SQL客戶端(例如Microsoft ODBC測試工具)測試您的查詢(只是示例中單引號之間的查詢)。 我希望該錯誤返回相同的錯誤,因此您至少要報告一個錯誤。
解決方法是將Windows中的語言設置(可能是臨時性的)配置為使用點而不是逗號作為小數點分隔符(而逗號而不是德國點可能將其用作千位分隔符),這樣就不會創建混亂)。
兩個小時后-解決方法的另一個想法:您可以嘗試:
SELECT
CAST(VPACKSP.VPTARA AS VARCHAR(16)) AS vptara
FROM VPACKSP
WHERE VPACKSP.VPTEIL = 123456
? 這樣,您就可以讓DB2執行到字符串的轉換,而不必將其留在前端-只是一個主意...
祝好運 -
Marco the Sane
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.