为什么我会得到一个“a”;[SQL0802]数据映射错误的数据转换”;例外?

为什么我会得到一个“a”;[SQL0802]数据映射错误的数据转换”;例外?,sql,ibm-midrange,data-conversion,Sql,Ibm Midrange,Data Conversion,我对iseries/DB2不是很熟悉。然而,我在一个网站上工作,该网站使用它作为其主要数据库 最近向现有表中添加了一个新列。当我通过AS400查看它时,我看到以下数据类型: Type: S Length: 9 Dec: 2 这告诉我这是一个数字字段,小数点前有6位,小数点后有2位 当我用一个简单的SELECT(selectmycolfromtable)查询数据时,我会毫无问题地返回所有记录。但是,当我尝试在同一列上使用不同的、分组依据、或排序依据时,我得到以下例外情况: [SQL0802] D

我对iseries/DB2不是很熟悉。然而,我在一个网站上工作,该网站使用它作为其主要数据库

最近向现有表中添加了一个新列。当我通过AS400查看它时,我看到以下数据类型:

Type: S
Length: 9
Dec: 2
这告诉我这是一个数字字段,小数点前有6位,小数点后有2位

当我用一个简单的SELECT(
selectmycolfromtable
)查询数据时,我会毫无问题地返回所有记录。但是,当我尝试在同一列上使用
不同的
分组依据
、或
排序依据
时,我得到以下例外情况:

[SQL0802] Data conversion of data mapping error
我推断至少有一条记录有无效数据——我的DBA称之为“空白”或“4o”。这怎么可能呢?当试图向该列添加无效数据时,数据库不应该引发异常吗

有什么办法可以解决这个问题,比如在我的查询中过滤掉那些坏记录吗?

“4 O”表示0x40,它是空格或空白字符的EBCDIC代码,是记录中任何新空格的默认值

遗留程序/操作可能会引入十进制数据错误。例如,如果使用带有
FMTOPT(*NOCHK)
选项的
CPYF
命令创建并填充了新文件


最简单的修复方法是编写一个HLL程序(RPG)来读取文件并更正记录。

如果文件关闭了记录格式级别检查[ie.
LVLCHK(*NO)
]或被覆盖到该级别,则为HLL程序。未使用新记录重新编译的(例如RPG、COBOL等)可能会写出此列中包含无效数据的记录,尤其是在新列不在记录末尾的情况下


确保重新编译所有使用本机I/O写入或更新此文件记录的程序。

我能找到的唯一解决方案是编写一个脚本,检查列中的空白值,然后在找到时将其更新为零。

我可以通过强制将键列强制转换为整数来解决此错误。我改变了加入这个

FROM DAILYV INNER JOIN BXV ON DAILYV.DAITEM=BXV.BXPACK
…为了这个

FROM DAILYV INNER JOIN BXV ON CAST(DAILYV.DAITEM AS INT)=CAST(BXV.BXPACK AS INT)

…而且我不必对表格做任何更正。这是一个非常旧、非常混乱的数据库,里面有很多垃圾。我已经做了很多更正,但这是一项正在进行的工作。

分区数字(9,2)列的小数点左侧有7位数字(即9减2)。SQL0802消息的第二级文本中显示的错误类型代码是什么?正如James所说,HLL程序可能是修复当前出错记录的最简单方法。但为了防止重复出现错误,您需要重新编译在物理文件或其上的任何逻辑文件中写入或更新记录的程序。