![](/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.