【问题标题】:Converting Oracle TIMESTAMP(6) TO SQL SERVER 2008 DATETIME2(6)将 Oracle TIMESTAMP(6) 转换为 SQL SERVER 2008 DATETIME2(6)
【发布时间】:2015-01-20 09:18:01
【问题描述】:

我正在将一个 csv 文件批量导入到 SQL Server 2008,该 csv 文件是通过从 Oracle SQL 开发人员导出表数据生成的。 该 csv 文件中一列的数据位于 TIMESTAMP(6) 中,我在 SQL Server 2008 中具有所需列的 DATETIME2(6) 数据类型。 我正在使用以下语句导入 CSV 文件

USE H_CLAIMS
GO
BULK INSERT H_CLAIMS.dbo.APPLICATION_QUEUES
FROM 'D:\MyWork\HC DB Work\HCAIDDB_CSV_EXPORTS\APPLICATION_QUEUES_export.CSV'

WITH (FIELDTERMINATOR = ',', ROWTERMINATOR = '\n') 去吧

在执行上述操作时,我收到以下错误 消息 4864,第 16 层,状态 1,第 1 行 第 1 行第 5 列 (CREATED_DATE) 的批量加载数据转换错误(指定代码页的类型不匹配或无效字符)。 消息 4864,第 16 级,状态 1,第 1 行

错误中提到的列中的示例数据就像 14 年 11 月 21 日 08.57.51.565214000 上午

所以我正在寻找答案,它可以通过批量插入语句期间的任何其他属性或任何可以将示例数据中的日期时间正确转换为 SQL SERVER 2008 datetime2 格式的转换函数来克服这个问题。

【问题讨论】:

    标签: sql sql-server sql-server-2008


    【解决方案1】:

    SQL Server 不知道如何将文本值“21-NOV-14 08.57.51.565214000 AM”转换为 DATETIME2 列。在查询分析器窗口中尝试:

    SELECT CAST('21-NOV-14 08.57.51.565214000 AM' AS DATETIME2(6))
    

    请注意,如果您使用的是 DATETIME2(6),与您尝试导入的内容相比,它会失去精度。看看http://msdn.microsoft.com/en-GB/library/bb677335.aspx

    当我不得不从 DB2 文本文件中执行此操作时,我使用了两种不同的方式。

    1. 将 datetime 字段导入 varchar,然后编写一些 SQL 将字符串操作为 SQL Server 可以识别的格式,例如。有点慢和笨重,尤其是在您有大量数据的情况下。
    2. 使用 SSIS 并创建一个转换来在那里进行字符串操作。这具有仍然能够批量插入目标表的优势,但确实意味着您需要能够访问集成服务。

    【讨论】:

      【解决方案2】:

      由于我找不到任何可以为我完成工作的批量插入,因此我采用了不同的方法。在进行了许多演员和转换之后,我遵循了以下方法,该方法按预期工作 我创建了一个函数,可以将 oracle timestamp(6) 转换为 sql 的 nvarchar,可以直接在 sql server 2008 中作为 datetime2(6) 数据类型插入。下面是函数 然后我使用了一个存储过程,它可以接受文件路径作为输入参数和一个临时表来保存基于 nvarchar 的 datetime2 值。在存储过程中,我使用了动态批量插入语句插入到所需的表中。程序在函数之后

      CREATE FUNCTION DATETIMECONVERTER
      (
      @ORACLETIMESTAMP NVARCHAR(100) 
      )RETURNS nvarchar(100)
      AS 
      BEGIN
      DECLARE @convertedString nvarchar(100); 
      select @convertedString= replace(@ORACLETIMESTAMP,'.',':');
      RETURN STUFF(@convertedString, CHARINDEX(':', @convertedString,18), 1, '.')
      END
      GO
      
      
      CREATE PROCEDURE IMPORT_APPLICATION_ROLES @PATH varchar(1000)
      AS
      IF OBJECT_ID('H_CLAIMS.DBO.TEMP_APPLICATION_QUEUES', 'U') IS NOT NULL
      DROP TABLE H_CLAIMS.DBO.TEMP_APPLICATION_ROLES
      CREATE TABLE H_CLAIMS.DBO.TEMP_APPLICATION_ROLES
      (
      ROLE_ID INT NOT NULL, 
      ROLE_NAME NVARCHAR(255), 
      ROLE_DESC NVARCHAR(255), 
      CREATED_BY NVARCHAR(100), 
      CREATED_DATE NVARCHAR(100), 
      UPDATED_BY NVARCHAR(100), 
      UPDATED_DATE NVARCHAR(100)
      )
      
      DECLARE @bulkInsert NVARCHAR(4000) = 'BULK INSERT TEMP_APPLICATION_ROLES FROM ''' + @PATH + ''' WITH ( FIELDTERMINATOR ='','', ROWTERMINATOR =''\n'' )';
      EXEC(@bulkInsert)
      
      INSERT INTO APPLICATION_ROLES
      (ROLE_ID,ROLE_NAME,ROLE_DESC,CREATED_BY,CREATED_DATE,UPDATED_BY,UPDATED_DATE)
      SELECT ROLE_ID,ROLE_NAME,ROLE_DESC,CREATED_BY,dbo.DATETIMECONVERTER(CREATED_DATE)AS CREATED_DATE,
      UPDATED_BY,dbo.DATETIMECONVERTER(UPDATED_DATE) AS UPDATED_DATE
      FROM H_CLAIMS.dbo.TEMP_APPLICATION_ROLES
      
      DROP TABLE H_CLAIMS.DBO.TEMP_APPLICATION_QUEUES
      GO
      

      执行语句我使用了下面的语句

      EXEC H_CLAIMS.DBO.IMPORT_APPLICATION_QUEUES @PATH='D:\my_export.CSV';
      

      【讨论】:

        【解决方案3】:

        确保在执行存储过程时将 .csv 文件放在服务器计算机驱动器中

        【讨论】:

          【解决方案4】:

          我可能会迟到回答这个问题,但请允许我给你我的解决方法(如果精度并不重要) 我将 oracle 表中的时间戳导入 SQL 2008 varchar,然后将 varchar 更新为适合 datetime2 的格式,然后将 SQL 表列更改为数据类型 datetime2。 EG:如果你有像'01-JAN-15 12.00.00.000000000 AM +05:30'这样的时间戳

          update My_Table 
          set MyTimeStamp = 
          substring(MyTimeStamp, 1,10)+
          REPLACE(substring(MyTimeStamp, 11, 8),'.',':')+
          substring(MyTimeStamp, 19, 13) 
          where MyTimeStamp like '%.%.%.%';
          
          alter table [My_Table] alter column MyTimeStamp DATETIME2; 
          Go;
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-05-02
            • 2013-07-06
            • 2012-04-03
            • 2014-09-12
            • 2016-11-30
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多