繁体   English   中英

显示的DB2数值不带小数位,MS SQL中的链接服务器

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM