如何修复元架构表 _Field 中的架构错误?表 PUB._Field 中的列 _Format 的值超过其最大长度或精度。”

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

我正在使用 Progress 9.1E 数据库应用程序。 (是的,我知道这听起来有多糟糕)

当我运行

SELECT * FROM SYSPROGRESS.SYSCOLUMNS_FULL
时,我的问题开始了,...这给了我这个错误:

错误 [HY000] [DataDirect][ODBC PROGRESS 驱动程序][PROGRESS]表

_Format
中的列
PUB._Field
的值超过其最大长度或精度。

(对于那些不知道的人来说,

SYSCOLUMNS_FULL
表实际上是在
VIEW
中定义的SQL
PUB._Sysviews
,它的定义为(本质上)
SELECT ... FROM PUB._Field INNER JOIN PUB._File

现在,如果这是一个普通的用户表,那么解决方案是在数据字典工具中编辑该列的 SQL 宽度 - 但这里的问题

_Field
是一个内置的元模式表,并且数据字典工具不允许编辑其列的 SQL 宽度。

...但我发现你可以解冻表,然后编辑它,然后重新冻结它,这就是我所做的:我将

_Format
的 SQL 宽度更改为 1024 个字符:

enter image description here

...我完全重新启动了机器(因为

_mprosrv.exe
_sqlsrv2.exe
进程无限期地缓存架构,我理解)。

...它并没有解决问题。


所以我的下一步是尝试看看

PUB._Field
中有什么可能导致这种情况;所以我运行了这个查询:

SELECT
    t."_File-Name"  AS Tbl,
    f."_Field-Name" AS Col,
    f."_Data-Type"  AS Typ,
    f."_Format"     AS Fmt,
    f."_Width"      AS Wid

FROM
    PUB."_Field" AS f
    INNER JOIN PUB.""_File"" AS t ON f."_File-recid" = t.ROWID

...这给了我与上面相同的错误。这是有道理的:显然我无法直接访问或使用

"_Format"
而不导致该错误,所以我尝试了 使用 ODBC 标量函数转义语法的技巧,这 应该 可以防止“坏值”被暴露给 ODBC 层:

SELECT
    { fn LENGTH( ""_Format"" ) } AS len
FROM
    PUB.""_Field""

...这并没有解决问题。


因此,我使用 Data Administration 工具将

_Field
元架构表/视图转储到
.d
文件 - 并将其导出到 CSV,以便我可以在 Excel 中打开它。

这是在 Excel 中打开的文本转储,所有行均按其

_Format
列值的长度排序(降序):

enter image description here

...最长定义的

_Format
值是 65 个字符长。

...所以也许问题根本不是

_Format
,而是其他地方是否有一些错误只是以这种方式出现?不管怎样,这超出了我目前的能力。


所以,我很困惑 - 因为这个版本太过时了,所以没有专业支持的选择。

progress openedge progress-4gl
1个回答
0
投票

看起来问题在于 _format 字段的实际值对您的客户来说是不可接受的。这些字段的格式设置为最大可能的十进制值 - 50 位数字加逗号等。即使要使用这些字段(对我来说它们看起来像是额外的“以防万一”字段),它们似乎不太可能具有以下值大的。所以做类似的事情:

for each _field:

  if _format begins "->,>>" and length( _format ) > 20 then
    _format = "->,>>>,>>>,>>9.9999999999".

end.

(显然首先在测试系统中执行此操作。)

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