【问题标题】:How do I convert an Oracle TIMESTAMP data type to SQL Server DATETIME2 data type while connected via Link Server.?如何在通过 Link Server 连接时将 Oracle TIMESTAMP 数据类型转换为 SQL Server DATETIME2 数据类型。?
【发布时间】:2015-04-16 06:20:28
【问题描述】:

我已经尝试了一些示例,但到目前为止还没有工作。 我有一个Link Server (SQL Server 2014) 到一个Oracle 12C Database

该表包含一个数据类型 TIMESTAMP,其数据如下:

22-MAR-15 04.18.24.144789000 PM

当尝试通过链接服务器在 SQL Server 2014 中查询此表时,使用此代码时出现以下错误:

SELECT CAST(OracleTimeStampColumn AS DATETIME2(7)) FROM linkServerTable

错误:

消息 7354,第 16 级,状态 1,第 8 行
链接服务器“MyLinkServer”的 OLE DB 提供程序“OraOLEDB.Oracle”为列“MyDateColumn”提供了无效的元数据。不支持该数据类型。

虽然错误是不言自明的,但我不确定如何解决。

我需要将timestamp 转换为datetime2。这可能吗?

【问题讨论】:

  • 也许这些链接会有所帮助:1, 2

标签: sql-server oracle


【解决方案1】:

您可以使用OPENQUERY 解决此问题。对我来说,通过链接服务器从 SQL 2008 连接到 Oracle 12,此查询失败:

SELECT TOP 10 TimestampField
FROM ORACLE..Schema.TableName

...出现此错误:

The OLE DB provider "OraOLEDB.Oracle" for linked server "ORACLE" supplied invalid metadata for column "TimestampField". The data type is not supported.

即使我不包含违规列(TIMESTAMP(6) 类型)也会发生这种情况。将其显式转换为 DATETIME 也无济于事。

但是,这是可行的:

SELECT * FROM OPENQUERY(ORACLE, 'SELECT "TimestampField" FROM SchemaName.TableName WHERE ROWNUM <= 10')

...返回的数据很好地流入DATETIME2() 字段。

【讨论】:

    【解决方案2】:

    解决问题的一种方法是在oracle server 中创建一个视图,并将OracleTimeStampColumn 转换为与sql server 的datetime2datatype 兼容。您可以在 oracle 服务器的视图中将时间格式更改为 24 小时格式,并将该字段标记为 varchar。然后在 SQL Server 中选择列时可以将varchar2 列转换为datetime2

    在 Oracle 服务器中

    Create or Replace View VW_YourTableName As 
    select to_char(OracleTimeStampColumn , 'DD/MM/YYYY HH24:MI:SS.FF')      OracleTimeStampColumn from YourTableName
    

    在 SQL Server 中

    SELECT CAST(OracleTimeStampColumn AS DATETIME2(7)) FROM **linkServerVIEW**
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-03
      • 1970-01-01
      • 2012-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-04
      相关资源
      最近更新 更多