我正在尝试使用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')
关于该做什么的任何想法?
答案 0 :(得分:2)
进度数据全部变量长度。进度应用程序通常会“过度填充”字段。 SQL工具经常反对这一点。 Progress db维护一个SQL-WIDTH属性,该属性可以使用Progress提供的“dbtool”实用程序进行更新。如果您要从Progress数据库中提取数据,必须定期使用此工具。
简单的方法是启动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个字符。