使用 SQL Server 2012,我正在连接到一个带有 Pervasive SQL 的链接服务器。
当我这样做select *
或者select field1,field2,field3....field15
我收到此错误时:
Msg 7399, Level 16, State 1, Line 1
The OLE DB provider "MSDASQL" for linked server "KSLAP208" 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 "KSLAP208".
我感觉好像存在某种内存问题?它不允许我选择超过一定数量的数据?
而如果我选择少量数据, select field1,field2
它就可以正常工作。
我究竟做错了什么?
答案1
微软网站上的一篇文章指出您可以通过禁用链接服务器的查询预取来解决此问题。
在服务器上的 ODBC 数据源管理器面板中,从系统 DSN 配置链接服务器。在“性能”选项卡下,取消选中“启用查询数据预取”框。好的,好的。在 SQL Management Studio 中删除并重新创建链接服务器。
您可以在创建 DSN 时清除“性能”选项卡中的“启用查询数据预取”复选框来禁用预取,或者在创建无 DSN 连接时向连接字符串添加“PREFETCH=0”。
由于我无法访问 Pervasive 的下载区域(并且 SQL Server 的 ODBC 连接在我的 Server 2012 安装上看起来完全不同),因此我无法对此进行测试。无论如何,它仍然可能对您有所帮助...
答案2
这是否可行:SELECT TOP 1 field1,field2,field3....field15。
如果可行,SELECT TOP 10 field1,field2,field3....field15 怎么样?
如果可行,SELECT TOP 100 field1,field2,field3....field15 怎么样?
重复,等等。
假设它在某个时候中断,请为唯一的列(或一组列)添加 ORDER BY 子句。重复并调整行数,直到找到罪魁祸首。例如,SELECT TOP 12345 有效,但 SELECT TOP 12346 无效。(良好的 ORDER BY 在这里很重要,以确保它每次都返回相同的数据集。)现在使用 WHERE 子句范围来获取出现在“好”数据底部的少量数据,然后稍微增加 WHERE 范围以包含坏行。如果它现在有效,那么这表明数据量至少证明了你最初的猜测,如果它仍然出错,请查看该查询中应该是 12346 的行,看看它是否有任何奇怪的地方。
如果这对你有帮助的话我可以详细说明。
答案3
我知道这个问题很久以前就被问到了,但是对于在谷歌上搜索并看到这篇文章的人来说......
我认为当您在链接到的服务器上运行该查询时,该查询是黄金查询?
您具体想查询什么?
你在做什么:
Select * from "the linked server"
-或者-
Select * from openquery("the linked server",'Select * from "the table"')
它们是有区别的:
- 首先从远程服务器提取所有记录,然后在本地服务器上进行查询。
- 第二种方法首先在远程服务器上运行查询。远程服务器仅返回结果集。
存在超时的可能性,但我不认为这是您遇到的问题。
我在将服务器链接到 时遇到了问题mysql
。我尝试了上面的 #1,似乎记得得到了同样无用的错误。事实证明,执行 #1 仅适用于(或效果最好)其他 SQL 服务器。当链接到非 SQL 服务器时,您必须使用 #2(openquery)。