我从进度数据库导入数据。
我收到以下错误:
表中的进度openge wire协议列有其值 最大长度或精度
有没有办法在select语句中指定选择列数据的特定长度?
例如:
SELECT SUBSTRING(EMAIL,15) FROM SQL92.PROGRESSTABLE
SUBSTRING确实给了我一个有效字段值的子字符串,但是当数据集点击" dirty"时,仍然会出现上述错误。行。
我无法访问Progress数据库,因此我无法运行进度DBTool来修复数据。
这里提出了同样的问题,但解决方案从未发布过。 Can I make an IDataReader ignore column length definitions?
答案 0 :(得分:1)
答案在这里:
ODBC Error "Column x in table y has value exceeding its max length or precision"
使用此花括号语法运行本机RDBMS(进度)函数,并在它到达ODBC之前修复数据:
SELECT { fn CONVERT(SUBSTRING( EMAIL,1,15) , SQL_VARCHAR) }
FROM SQL92.PROGRESSTABLE
我无法相信人们会选择使用容易损坏数据的数据库。
作为一些背景知识,如果对进度使用SSIS,则可能会遇到两种错误:
"输出列的数据类型" xyz" (N)"与数据类型不匹配" System.Decimal"源列" xyz"
(可以是任何数据类型)
我想这意味着数据类型已经由Progress在幕后自动更改。它与SSIS中保存的不同,当然它并不喜欢。
短期解决方案是打开包并通过双击源
来刷新元数据另一个错误是:
表yyy中的列xxx的值超过其最大长度或精度。
这意味着,例如,数据库中有371个字符长的数据,但数据说明其长度为324个字符。
对这两者的长期解决方案是将所有内容包装在上面的类似构造中 - 在它到达ODBC驱动程序之前强制转换它以获得一致的数据类型。它当然会被截断,但这可能比它失败更好。
答案 1 :(得分:0)
从ODBC连接检索的SQL数据的数据长度由Progress数据库字段的“Width”属性确定。通过选择所需的表格,然后在菜单栏“选项”,“调整字段宽度”中选择,可以通过“进度数据字典”访问它。在CHAR字段中,通常使用对应于两次“格式”宽度的值定义“宽度”属性。
例如:字段FOO,类型CHAR,格式“x(20)”默认情况下具有40 SQL宽度值,是原始格式大小的两倍。
尽管您可以在格式为“x(20)”的CHAR字段中写入长度大于20个字符的数据,只要Progress不关心其字段中存储的数据量和“格式”短语仅出于显示目的(当然,在他的数据类型大小限制内),它限制了具有硬限制的SQL连接的数据长度,例如Oracle。换句话说,例如,只要您不能在定义为N length的Oracle数据库字段中编写N + n个字符,如果它们的字段被定义为格式,则无法通过ODBC连接从Progress数据库中检索数据“ x(N)“和存储在其上的数据超过2N。
如果您无法访问Progress数据库,则可以联系负责存储在Progress数据库中的数据的人员,并要求他调整数据库架构上的字段大小以匹配存储的全部数据。在数据库上存储数据的程序可能与数据库字段大小不一致。否则,您将无法从具有存储超过“宽度”字符的字段的表中检索数据。