无法从OLE DB提供程序“MSDASQL”获取链接服务器“进度”的行

时间:2013-11-08 13:34:29

标签: sql-server-2008 linked-server openedge progress-db

我正在尝试使用SQL Server 2008 R2上的openquery从Progress Database中选择一些数据,但我收到此错误消息。

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".

我做了一些测试,我发现问题出在一个特殊的列,它是一个varchar列。该列有大约30列,对于它们,选择工作正常。 这是我的问题:

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')

关于该做什么的任何想法?

2 个答案:

答案 0 :(得分:2)

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

http://knowledgebase.progress.com/articles/Article/P24496?q=how+to+use+dbtool+to+modify+sql-width&l=en_US&c=Product_Group%3AOpenEdge&fs=Search&pn=1

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

或者您可以使用以下SQL:

ALTER TABLE ALTER COLUMN SET PRO_SQL_WIDTH;

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

答案 1 :(得分:1)

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

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

因此,如果列定义为30个字符且列包含50,则substring(col,1,50)实际上将检索所有50个字符。

相关问题