【发布时间】:2013-07-31 19:10:19
【问题描述】:
以下查询在使用 TOAD(使用本机 Oracle 驱动程序)直接针对 Oracle 11 运行时可以高效运行
select ... from ... where ...
and srvg_ocd in (
select ocd
from rptofc
where eff_endt = to_date('12/31/9999','mm/dd/yyyy')
and rgn_nm = 'Boston'
) ...
;
如果通过openquery() 从 SQL Server 2008 传递到同一个 Oracle 数据库,则返回完全相同的查询“从不”。 SQL Server 有一个使用 Oracle Provider OLE DB 驱动程序到 Oracle 数据库的链接。
select * from openquery( servername, '
select ... from ... where ...
and srvg_ocd in (
select ocd
from rptofc
where eff_endt = to_date(''12/31/9999'',''mm/dd/yyyy'')
and rgn_nm = ''Boston''
) ...
');
查询没有在合理的时间内返回,用户终止了查询。我不知道它最终是否会返回正确的结果。
直接 TOAD 查询高效工作且 openquery() 版本“从不”返回的结果是可重现的。
对openquery() 的小修改给出了正确的有效结果:将eff_endt 更改为trunc(eff_endt)。
这很好,但似乎没有必要进行更改。
openquery()应该是通过的,那么TOAD和openquery()的行为怎么会有区别呢?
我们关心的原因是因为我们经常使用 TOAD 直接访问 Oracle 来开发复杂的查询。一旦查询功能和优化后,我们将其转换为openquery() 字符串以在 SQL Server 应用程序中使用。当我们知道它作为直接查询工作时,查询突然以openquery() 失败是非常令人恼火的。然后我们必须通过反复试验寻找解决方法。
我想查看这两个场景的 Oracle 跟踪文件,但 Oracle 服务器在另一个组织内,我们没有得到 Oracle DBA 的合作。
有谁知道任何驱动程序、TOAD 或 ???可能导致差异的问题?有什么办法可以消除这个问题,让这两种方法总是给出相同的结果?
【问题讨论】:
标签: tsql sql-server-2008-r2 oracle11g toad openquery