0

我在 SQL Server 2008 上有一个预定的 AM 进程,它使用链接服务器从 Oracle 导入数据。我正在使用 drop table 覆盖从 Oracle 导入的数据,然后选择模式

显然,“order by”的存在影响了我的最终结果!看一看。

--This works fine to give me the one row I'm expecting from the newly imported table:
drop table t1;
SELECT * into t1 fROM OPENQUERY(ODBC_CSRPT,'
select 
 EXTERNAL_ORGANIZATION_ID  
 ,ORGANIZATION_DESC
 ,STATE
from sysadm.uv_CS_EXTERNAL_ORGANIZATIONS
order by EXTERNAL_ORGANIZATION_ID asc ');
go

select * from t1 
where external_organization_id = '1000107'
go

但这(下)不返回任何行。我的 orgId 1000107 现在不见了?

drop table t1;
SELECT * into t1 fROM OPENQUERY(ODBC_CSRPT,'
select 
 EXTERNAL_ORGANIZATION_ID  
 ,ORGANIZATION_DESC
 ,STATE
from sysadm.uv_CS_EXTERNAL_ORGANIZATIONS ');
go

select * from t1 
where external_organization_id = '1000107'
go

如您所见,唯一改变的是 order by 子句的存在。另一个花絮是,无论“order by”是否存在,链接服务器查询都返回相同的行数(准确地说是 51,225 行)。有任何想法吗?

4

4 回答 4

0

您可能需要在 Oracle 上重新计算索引吗?

于 2009-09-21T16:50:56.353 回答
0

是否有像 SET ROWCOUNT 这样的选项有效?特别是在链接的 Oracle 数据库上。自从我对 Oracle 做过任何事情以来已经有好几年了,所以我不记得他们的详细信息了。

于 2009-09-21T17:16:43.930 回答
0

基于提供程序的链接服务器:“Oracle Provider for OLE DB”(而不是基于本地系统 ODBC 连接“Microsoft OLE DB Provider for ODBC Drivers”)首先尝试返回完整的结果集。

出于某种原因,对于可以返回的最大行数,ODBC 连接的上限必须较低。我发现的唯一设置是“获取缓冲区大小”,我尝试加倍,仍然返回相同数量的行。

对于这个查询,我将只使用另一个链接服务器。

再次感谢大家的投入!

于 2009-09-22T14:06:40.793 回答
0

似乎我在 51,225 行时遇到了某种上限。我不控制 Oracle 方面,我组织的另一个部门可以。他们的一个人说,确切的查询应该返回 51,324 行。

所以,真正发生的是我比完整的结果集少了 99 行。我的“order by”子句重新确定了结果的优先级,并且恰好给了我正在寻找的那一行。当然不幸的是,它仍然会产生 99 个其他结果!

我不知道 51,225 这个数字有什么意义。我很难想象链接服务器的 sql server 配置会以某种方式设置(我在设置时只是使用默认值)。

更糟糕的情况是,我将导入拆分为 2 个查询,顺序相反,因此我涵盖了所有基础。不过,我真的需要深入了解那个神秘的 51,225“上限”……

非常感谢所有输入!

于 2009-09-22T00:44:53.920 回答