SQL:OPENQUERY不返回所有行

时间:2010-12-15 20:45:36

标签: tsql

我有以下内容查询我必须与之交谈的链接服务器。

选择               * FROM

OPENQUERY(DWH_LINK,'SELECT * FROM TABLEA')

它通常会返回大部分数据,但有些行丢失了吗?

链接服务器来自oracle客户端

这是否是任何人遇到w / openquery的问题?

4 个答案:

答案 0 :(得分:4)

我有完全相同的问题。

根本原因是您使用ODBC而不是OLE DB设置了链接服务器。

以下是我修复它的方法:

  • 从SQL Server中删除链接服务器
  • 右键单击“Linked Servers”文件夹,然后选择“New Linked Server ...”
  • 链接服务器:输入任何内容..这将是您新链接服务器的名称
    • 提供商:选择“Oracle Provider for OLE DB”
    • 产品名称:输入“Oracle”(不带双引号)
    • 数据源:从TNSNAMES.ORA文件中输入别名。就我而言,它是“ABC.WORLD”(没有双引号)
    • 提供商字符串:将其留空
    • 位置:留空
    • 目录:留空

现在转到“安全”标签,然后点击最后一个单选按钮,上面写着“使用此安全上下文制作:”并输入用户名&您的连接密码

那应该是它!

答案 1 :(得分:0)

这似乎与底层提供程序功能有关,而其他人也遇到了这种和类似的大小/行限制。一种可能的解决方法是实现迭代/循环查询,其中内置一些过滤以回退一定量的行。使用oracle,我认为这可能是使用rownum(不太熟悉oracle)。

类似

--Not tested sql, just winging it syntax-wise
SELECT * FROM OPENQUERY(DWH_LINK, 'SELECT * FROM TABLEA where rownum between 0 AND 500')
SELECT * FROM OPENQUERY(DWH_LINK, 'SELECT * FROM TABLEA where rownum between 500 AND 1000')
SELECT * FROM OPENQUERY(DWH_LINK, 'SELECT * FROM TABLEA where rownum ...')

BOL: link 这取决于OLE DB提供程序的功能。虽然查询可能返回多个结果集,但OPENQUERY只返回第一个结果集。

答案 2 :(得分:0)

使用Oracle 10即时客户端和ODBC时遇到了同样的问题。当我连接到Oracle 10gR2数据库时,我使用了这个客户端。我在Microsoft支持下打开了一张票,他们建议使用Oracle 11即时客户端。惊喜!卸载10g即时客户端,安装11g即时客户端并重新启动解决了问题。

答案 3 :(得分:0)

我对SQL 2014通过OPENQUERY从SQL 2000获取数据时遇到了同样的问题。因为ODBC兼容性问题,我不得不为ODBC驱动程序保留通用OLE DB。而且,问题仅在于SQL非管理员帐户。 最后,我找到的解决方案是添加SET ROWCOUNT 0:

SELECT * FROM OPENQUERY(DWH_LINK, 'SET ROWCOUNT 0 SELECT * FROM TABLEA ')

似乎rowcount可能在某个地方通过SQL过程(或用于此用户会话)进行了更改,因此将其设置为0会强制它返回“所有行”。