Sql server 2008 无法从OLE DB提供程序中获取行";MSDASQL";“用于链接服务器”;“进展”;

Sql server 2008 无法从OLE DB提供程序中获取行";MSDASQL";“用于链接服务器”;“进展”;,sql-server-2008,linked-server,openedge,progress-db,Sql Server 2008,Linked Server,Openedge,Progress Db,我试图使用SQLServer2008R2上的openquery从进度数据库中选择一些数据,但收到了此错误消息 Msg 7399, Level 16, State 1, Line 1 The OLE DB provider "MSDASQL" for linked server "progress" reported an error. The provider reported an unexpected catastrophic failure. Msg 7330, Level 16, Sta

我试图使用SQLServer2008R2上的openquery从进度数据库中选择一些数据,但收到了此错误消息

Msg 7399, Level 16, State 1, Line 1
The OLE DB provider "MSDASQL" for linked server "progress" reported an error. The provider reported an unexpected catastrophic failure.
Msg 7330, Level 16, State 2, Line 1
Cannot fetch a row from OLE DB provider "MSDASQL" for linked server "progress".
我做了一些测试,发现问题出在一个specify列上,它是一个varchar列。该列大约有30列,对于它们,select可以正常工作。 这是我的疑问:

SELECT * from openquery(progress, 'select DescricaoProduto from MP.pub.IMPproduto')
我试着做了一些不同的选择,但没有一个成功。例如:

SELECT * from openquery(progress, 'select Cast(DescricaoProduto as char(100)) as DescricaoProduto from MP.pub.IMPproduto')

你知道怎么做吗?

进度数据是所有的可变长度。应用程序的进度通常是“超负荷”字段。SQL工具经常反对这一点。Progress db维护一个SQL-WIDTH属性,该属性可以使用Progress提供的“dbtool”实用程序进行更新。如果要从进度数据库中提取数据,必须定期使用此工具

简单的方法是启动PROENV(在OpenEdge程序组中找到),然后运行“dbtool dbname”并选择选项2

也可以使用以下SQL:

ALTER TABLE ALTER COLUMN SET PRO_SQL_WITH


如果您知道是哪个表和列导致了问题,并且不需要扫描所有内容。

解决此问题的另一种方法是使用子字符串,如下所示:

SELECT * from openquery(progress, 'select substring(DescricaoProduto,1,100) as DescricaoProduto from MP.pub.IMPproduto')
因此,如果该列定义为30个字符,并且该列包含50个字符,那么子字符串(col,1,50)将实际检索所有50个字符