使用 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 修复宽度列的情况下执行此查询。
花了几分钟才找到答案。问题似乎出在 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
升级至 OE 11.6。
11.6 中有选项可以自动、静默地截断数据,这样你就不会收到错误。
“自主架构更新”
https://community.progress.com/community_groups/openedge_rdbms/f/18/t/19534
我不是一个进度开发人员,但是当我使用sql(例如通过jbdc)时,我使用的技巧是具有巨大长度的substr(例如50000)。
SELECT SUBSTR(my_field, 1, 50000)
FROM my_table
它已经工作了很多年,今天我再次使用它。