ODBC 错误“表 y 中的列 x 的值超过其最大长度或精度”

问题描述 投票:0回答:3

使用 ODBC 运行以下查询时,我从进度数据库收到此错误:

SELECT distinct Table.column,
        { fn CONVERT(SUBSTRING(Table.ProblematicColumn, 1, 60), SQL_VARCHAR)} as test
FROM PUB.Table
WHERE ( Table.id IN (
            SELECT Table.id
             FROM PUB.Table
            ) ) 

我知道可以使用 DBTools 修复它。但是,我对多个客户端的多个进度数据库运行查询,因此每次都执行此操作并不实际。 另外,由于某种原因,我使用的 ODBC 客户端 (PHP) 在发生这种情况时不会显示任何错误。相反,它返回一个空结果。

我对 60 个字符的 VAR_CHAR 所做的转换确实有所帮助,直到我添加了子查询。当子查询存在时,我再次遇到同样的错误。

有趣的是,当“独特”不存在时,它就起作用了。但我确实需要独特的。

编辑:问题是如何在不使用 DBTool 修复宽度列的情况下执行此查询。

odbc openedge progress-db
3个回答
3
投票

花了几分钟才找到答案。问题似乎出在 OE10 SQL 代理中,未处理 where 子句中的子选择。这种使用内部联接到子选择的替代方案看起来与我等效。我测试了一下,确实有效。更换 SQL 客户端不会执行任何操作,错误发生在 OpenEdge SQL 代理中:我使用 OpenEdge JDBC 驱动程序也遇到相同的错误。

SELECT distinct Table.column,
   { fn CONVERT(SUBSTRING(Table.ProblematicColumn, 1, 60), SQL_VARCHAR)} as test
FROM PUB.Table inner join (select id from PUB.Table) t2 on Table.id = t2.id

0
投票

升级至 OE 11.6。

11.6 中有选项可以自动、静默地截断数据,这样你就不会收到错误。

“自主架构更新”

https://community.progress.com/community_groups/openedge_rdbms/f/18/t/19534


0
投票

我不是一个进度开发人员,但是当我使用sql(例如通过jbdc)时,我使用的技巧是具有巨大长度的substr(例如50000)。

SELECT SUBSTR(my_field, 1, 50000) 
FROM my_table

它已经工作了很多年,今天我再次使用它。

© www.soinside.com 2019 - 2024. All rights reserved.