我正在使用 Progress 9.1E 数据库应用程序。 (是的,我知道这听起来有多糟糕)。
当我运行
SELECT * FROM SYSPROGRESS.SYSCOLUMNS_FULL
时,我的问题开始了,...这给了我这个错误:
错误 [HY000] [DataDirect][ODBC PROGRESS 驱动程序][PROGRESS]表
中的列_Format
的值超过其最大长度或精度。PUB._Field
(对于那些不知道的人来说,
SYSCOLUMNS_FULL
表实际上是在VIEW
中定义的SQLPUB._Sysviews
,它的定义为(本质上)SELECT ... FROM PUB._Field INNER JOIN PUB._File
)
现在,如果这是一个普通的用户表,那么解决方案是在数据字典工具中编辑该列的 SQL 宽度 - 但这里的问题是
_Field
是一个内置的元模式表,并且数据字典工具不允许编辑其列的 SQL 宽度。
...但我发现你可以解冻表,然后编辑它,然后重新冻结它,这就是我所做的:我将
_Format
的 SQL 宽度更改为 1024 个字符:
...我完全重新启动了机器(因为
_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
列值的长度排序(降序):
...最长定义的
_Format
值是 65 个字符长。
...所以也许问题根本不是
_Format
,而是其他地方是否有一些错误只是以这种方式出现?不管怎样,这超出了我目前的能力。
所以,我很困惑 - 因为这个版本太过时了,所以没有专业支持的选择。
看起来问题在于 _format 字段的实际值对您的客户来说是不可接受的。这些字段的格式设置为最大可能的十进制值 - 50 位数字加逗号等。即使要使用这些字段(对我来说它们看起来像是额外的“以防万一”字段),它们似乎不太可能具有以下值大的。所以做类似的事情:
for each _field:
if _format begins "->,>>" and length( _format ) > 20 then
_format = "->,>>>,>>>,>>9.9999999999".
end.
(显然首先在测试系统中执行此操作。)