【问题标题】:Microsoft SQL Server and Oracle SQL DeveloperMicrosoft SQL Server 和 Oracle SQL Developer
【发布时间】:2020-07-02 21:24:08
【问题描述】:

我在 Microsoft SQL Server Management Studio 18 中将 Oracle 数据库链接到我的 SQL Server。服务器对象 -> 链接服务器。

我有一条 SQL 语句,当我在 Oracle 开发人员工具/平台上运行时,它会按预期返回信息。但是当我在 SQL Server 上运行完全相同的查询时,它返回的结果不正确(行和列中的实际值不匹配)。

我知道的。

  • 我查询的表位于 Oracle 数据库中。
  • 如果我在 WHERE 语句中排除任何涉及 DATE 的内容,我可以在 Oracle Developer 和 SQL Server 上获得相同/匹配的结果。

有什么想法吗?

下面的查询示例。 适用于 Oracle Developer 但不适用于 MSSQL

SELECT * FROM TABLE1
WHERE status = 'Deviation' and trunc(SRC_ROW_UPDT) BETWEEN TO_DATE('01/03/2020', 'DD/MM/YYYY') AND TO_DATE('10/12/2020','DD/MM/YYYY');

下面的查询示例。 适用于 Oracle Developer 和 MSSQL

SELECT * FROM TABLE1
WHERE status = 'Deviation' and BATCHID = 'ThisBAtchID';

【问题讨论】:

  • 尝试向我们展示查询,因为它似乎是 where + date 的问题。
  • 我在上面加了。我不认为 MSSQL 语句喜欢“trunc, between, to_date”,但我尝试更改它以满足日期之间过滤器的 mssql 格式,但仍然没有得到正确的信息返回。
  • 两件事,1) 首先构建一个在 Oracle 和 SQL Server 中都有效的查询,即只使用两者通用的函数。 2)确保您使用明确的日期格式,例如ISO。

标签: sql sql-server oracle


【解决方案1】:

您不能在 SQL Server 调用中使用 ORACLE 特定的函数,例如 TO_DATE。您必须使用 OPENQUERY 远程执行它们。 OPENQUERY in MSDN

SELECT * FROM OPENQUERY (OracleSvr, 'SELECT * FROM TABLE1
WHERE status = ''Deviation'' and trunc(SRC_ROW_UPDT) BETWEEN TO_DATE(''01/03/2020'', ''DD/MM/YYYY'') AND TO_DATE(''10/12/2020'',''DD/MM/YYYY'');');

【讨论】:

  • 我实际上正在尝试 OPENQUERY,但我仍然得到相同的结果。看起来如果我的声明中有任何处理 DATE 的内容,我没有得到正确的结果。但如果我没有任何带有日期过滤器的东西,它会返回正确的结果。很奇怪,当数据返回不正确时,表中的一列向上或向下移动了几行,然后数据在各行之间不匹配。
  • @ItecaSolutions,RDBMS 不保证顺序,除非您指定 ORDER BY 子句。看来,您指定 ORDER BY 子句的方式存在问题。重温 TRUNC(),为什么要指定 TRUNC 与日期调用?
猜你喜欢
  • 1970-01-01
  • 2014-07-10
  • 2012-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-19
  • 2018-01-09
  • 1970-01-01
相关资源
最近更新 更多