2

我正在从进度数据库中导入数据。

我收到以下错误:

表中的 Progress opensge wire protocol 列具有超出其最大长度或精度的值

有没有办法在选择语句中指定选择列数据的特定长度?

例如: SELECT SUBSTRING(EMAIL,15) FROM SQL92.PROGRESSTABLE

SUBSTRING 确实给了我一个有效字段值的子字符串,但是当数据集到达“脏”行时仍然失败并出现上述错误。

我无权访问 Progress 数据库,因此无法运行 progress DBTool 来修复数据。

在这里提出了同样的问题,但从未发布过解决方案。 我可以让 IDataReader 忽略列长度定义吗?

4

2 回答 2

1

答案在这里:

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

使用这个花括号语法运行原生 RDBMS(进度)函数并在数据到达ODBC之前修复数据:

SELECT  { fn CONVERT(SUBSTRING( EMAIL,1,15) , SQL_VARCHAR) } 
FROM SQL92.PROGRESSTABLE

我不敢相信人们选择使用如此容易允许损坏数据的数据库。

作为一些背景知识,如果对 Progress 使用 SSIS,您可能会遇到两种错误:

“输出列“xyz”(n)”的数据类型与源列“xyz”的数据类型“System.Decimal”不匹配

(可以是任何数据类型)

我想这意味着数据类型已被 Progress 自动更改。它与它当然不喜欢的保存在 SSIS 中的不同。

短期解决方案是通过双击源打开包并刷新元数据

另一个错误是:

表 yyy 中的列 xxx 的值超过了其最大长度或精度。

这意味着例如数据库中有 371 个字符长的数据,但数据字典说它有 324 个字符长。

这两种情况的长期解决方案是将所有内容包装在与上述类似的构造中 - 在它到达 ODBC 驱动程序以获得一致的数据类型之前对其进行转换。它当然会截断,但这可能比失败要好。

于 2017-05-16T05:18:02.093 回答
0

从 ODBC 连接检索的 SQL 数据的数据长度由 Progress 数据库字段的“Width”属性确定。这可以通过“进度数据字典”访问,方法是选择所需的表,然后在菜单栏中选择“选项”、“调整字段宽度”。在 CHAR 字段中,“Width”属性通常使用对应于“Format”宽度的两倍的值来定义。

例如:一个 FOO 字段,类型 CHAR,格式“x(20)”默认有一个 40 SQL Width 值,是原始格式大小的两倍。

尽管您可以在格式为“x(20)”的 CHAR 字段中写入长度大于 20 个字符的数据,只要 Progress 不关心其字段中存储的数据量,并且“格式”短语仅用于显示目的(当然,在他的数据类型大小限制内),它通过硬限制限制 SQL 连接的数据长度,例如 Oracle 所做的。换句话说,例如,只要您不能在定义为 N 长度的 Oracle 数据库字段中写入 N + n 个字符,您就不能通过 ODBC 连接从 Progress 数据库中检索数据,如果这些字段定义为格式“ x(N)" 并且存储在其上的数据通常超过 2N。

如果您无权访问 Progress 数据库,您可以联系负责存储在 Progress 数据库中的数据的人员,并要求他调整数据库架构上的字段大小以匹配存储的全部数据量。将数据存储在数据库中的程序可能与数据库字段大小不一致。否则,您将无法从具有存储超过“宽度”字符的字段的表中检索数据。

于 2014-09-23T12:27:40.203 回答