簡體   English   中英

將 Oracle TIMESTAMP(6) 轉換為 SQL SERVER 2008 DATETIME2(6)

[英]Converting Oracle TIMESTAMP(6) TO SQL SERVER 2008 DATETIME2(6)

我正在將 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') 去

在執行上述操作時,我收到第 1 行第 5 列(CREATED_DATE)的以下錯誤消息:消息 4864,級別 16,狀態 1,第 1 行批量加載數據轉換錯誤(指定代碼頁的類型不匹配或無效字符)。 消息 4864,級別 16,狀態 1,第 1 行

錯誤中提到的列中的樣本數據類似於 21-NOV-14 08.57.51.565214000 AM

所以我正在尋找答案,它可以在批量插入語句期間使用任何其他屬性或任何可以將示例數據中的日期時間正確轉換為 SQL SERVER 2008 datetime2 格式的轉換函數來克服這個問題。

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. 將日期時間字段導入 varchar,然后編寫一些 SQL 來將字符串操作為 SQL Server 可以識別的格式,例如。 有點慢和笨重,特別是如果你有很多數據。
  2. 使用 SSIS 並創建一個轉換來在那里進行字符串操作。 這具有仍然能夠批量插入目標表的優勢,但確實意味着您需要能夠訪問集成服務。

由於我找不到任何可以為我完成工作的批量插入,因此我采用了不同的方法。 在進行了多次轉換和轉換之后,我遵循了以下方法,該方法按預期工作2008. 下面是函數然后我使用了一個存儲過程,它可以接受文件路徑作為輸入參數和一個臨時表來保存基於 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';

確保在執行存儲過程時將 .csv 文件放在服務器機器驅動器中

我可能會遲到回答這個問題,但請允許我給你我的解決方法(如果精度並不重要)我將時間戳從 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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM