SQL SSIS导入错误:表中的PROGRESS openge wire协议列具有超出其最大长度或精度的值

时间:2014-09-15 15:10:17

标签: ssis openedge progress-db

我从进度数据库导入数据。

我收到以下错误:

  

表中的进度openge wire协议列有其值   最大长度或精度

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

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

SUBSTRING确实给了我一个有效字段值的子字符串,但是当数据集点击" dirty"时,仍然会出现上述错误。行。

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

这里提出了同样的问题,但解决方案从未发布过。 Can I make an IDataReader ignore column length definitions?

2 个答案:

答案 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数据库中的数据的人员,并要求他调整数据库架构上的字段大小以匹配存储的全部数据。在数据库上存储数据的程序可能与数据库字段大小不一致。否则,您将无法从具有存储超过“宽度”字符的字段的表中检索数据。