SQL Server OpenQuery()的行为与TOAD的直接查询不同

dbe*_*ham 5 t-sql toad openquery oracle11g sql-server-2008-r2

使用TOAD直接针对Oracle 11运行时,以下查询有效工作(使用本机Oracle驱动程序)

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'
) ...
;
Run Code Online (Sandbox Code Playgroud)

如果从SQL Server 2008传递到同一个Oracle数据库,则完全相同的查询"never"将返回openquery().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''
  ) ...
');
Run Code Online (Sandbox Code Playgroud)

查询不会在合理的时间内返回,并且用户会终止查询.我不知道它最终会以正确的结果返回.

直接TOAD查询有效工作且openquery()版本"从不"返回的结果是可重现的.

对它的一个小修改openquery()给出了正确有效的结果:eff_endt改为trunc(eff_endt).

这很好,但似乎不应该有必要改变.

openquery()应该通过,那么TOAD和openquery()行为之间怎么会有区别呢?

我们关心的原因是因为我们经常使用TOAD直接访问Oracle来开发复杂的查询.一旦我们对查询起作用并进行了优化,我们就将其转换为一个openquery()字符串,以便在SQL Server应用程序中使用.openquery()当我们知道它作为直接查询工作时,查询突然失败是非常恼人的.然后我们必须通过反复试验来寻找解决方法.

我想看两个场景的Oracle跟踪文件,但Oracle服务器在另一个组织内,我们没有得到Oracle DBA的合作.

有谁知道任何驱动程序,或TOAD,或??? 可能导致差异的问题?有没有办法消除这个问题,这两种方法总是给出相同的结果?

小智 1

我知道你不久前问过这个问题,但我刚刚遇到你的问题。

我同意,它们应该是相同的。显然是有区别的。我们需要找出差异在哪里。

我一边打字一边大声思考……

如果您只指定几列而不是 select * from openquery 会发生什么?

应该返回多少行?

如果在 oracle select 中限制返回的行怎么办?

openquery 超时多久?

TOAD 和 SS 在同一台机器上吗?您是否通过 RDPing 进入 SS 并从那里运行蟾蜍?

他们使用相同的驱动程序吗?包括位?(32/64) 版本?

他们在 oracle 上使用相同的帐户吗?

有趣的是,使用它trunc()会有所不同。我假设 [eff_endt] 是返回的字段之一?

我想知道 SS 是否正在取回所有行,但它在进行日期转换时令人窒息。oracle中的日期类型可能需要转换为ss日期类型,然后ss才会显示给您。

如果将 openquery 中的行插入到日期字段只是(n)varchar. 我认为 ss 可能只是将从 Oracle 返回的日期转储到该文本字段中,而不尝试对其进行转换。

就像是:

insert into mytable(f1,f2,f3,datetimeX)
select f1,f2,f3,datetimeX from openquery( servername, '
  select f1,f2,f3,datetimeX 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''
  ) ...
');
Run Code Online (Sandbox Code Playgroud)

如果 toad 或 ss 在将查询语句发送到 oracle 之前修改该查询语句怎么办?您可以启动wireshark并查看toad和ss实际发送的内容。

如果你能解决这个问题,我会很好奇。我经常将 ss 链接到 oracle,但没有遇到这个问题。