2013-05-29 119 views
4

我想將一個值「5/27/2013 16:42:37.490000」(從平面文件(DT_STR)讀取)插入到SQL Server表的列(日期時間)中。如果我嘗試在派生列中使用(DT_DBDATE)或DT_DBTIMESTAMP進行強制轉換,則會發生錯誤。將字符串轉換爲日期時間(使用SSIS)

[Derived Column [130]] Error: SSIS Error Code DTS_E_INDUCEDTRANSFORMFAILUREONERROR. The "component "Derived Column" (130)" failed because error code 0xC0049064 occurred, and the error row disposition on "output column "Derived Column 1" (155)" specifies failure on error. An error occurred on the specified object of the specified component. There may be error messages posted before this with more information about the failure. 

我該怎麼辦?

由於

回答

9

的值是datetime2型.AFAIK SSIS不支持DATETIME2。你需要將其存儲在數據庫中作爲字符串,然後通過將其轉換到DATETIME2更新列。

這裏是Microsoft Connect Issue

更新:使用DT_DBTIMESTAMP2您可以將字符串正確的日期時間格式

下面的代碼在派生列

(DT_DBTIMESTAMP2,7)"2013-5-27 16:42:37.490000" 

7完全正常的轉換是旋進這裏。如果日期時間格式不同,上述代碼將不起作用。例如MM/DD/YYYY HH:mm:ss.ffffff

但是你可以使用Script component,並通過不同的日期時間格式數組Datetime.ParseExact功能

第一步:將一個腳本組件,並創建DT_DBTIMESTAMP數據類型的新輸出列,並將它命名爲NewDate

第二步:寫下面的C#代碼

public override void Input0_ProcessInputRow(Input0Buffer Row) 
{ 
    string[] format = new string[] { @"M/dd/yyyy HH:mm:ss.ffffff", 
             @"MM/dd/yyyy HH:mm:ss", 
             @"M/d/yyyy HH:mm:ss" , 
             @"M/dd/yyyy HH:mm:ss.ffffff", 
             @"MM/dd/yyyy HH:mm:ss.ffffff", 
              @"M/d/yyyy HH:mm:ss.ffffff"}; 
    DateTime dt = DateTime.ParseExact(Row.Date, 
       format , 
       CultureInfo.InvariantCulture, 
       DateTimeStyles.None); 

    Row.newDate = dt; 
} 
+0

謝謝Praveen帶給我的知識。什麼可以解決這個問題?正如你上面提到的轉換不能適用於某些限制。 – Akshay

+0

@Akshay否,MS Connect鏈接中的條目說:「要在SSIS中使用DATETIME2類型,請使用DT_DBTIMESTAMP2類型。」這是一個不受支持的AS400 DATETIME2類型。對於SQL Server類型,您只需知道將其稱爲「DT_DBTIMESTAMP2」。 – criticalfix

+0

我無法使用它,因此也就是這個問題。你能否告訴我可以使用的表達方式?現在,SQL表格列是(DATETIME類型)。我如何插入上面提到的值?我是否需要改變我的表格列類型? – Akshay

0

我不會說這是完美的解決方案,而只是一種變通方法。 格式化輸入然後插入。使用下面的表達式後格式化的數據適用於datetime或datetime2。

SUBSTRING(TMS_CREAT,(FINDSTRING(TMS_CREAT,"/",2) + 1),4) + "-" + SUBSTRING(TMS_CREAT,1,(FINDSTRING(TMS_CREAT,"/",1) - 1)) + "-" + SUBSTRING(TMS_CREAT,(FINDSTRING(TMS_CREAT,"/",1) + 1),2) + SUBSTRING(TMS_CREAT,(FINDSTRING(TMS_CREAT,"/",2) + 5),16) 
+0

這不是一個有效的方法,而且如果你的日期格式爲例'5/7/2013 16:42:27.490000' – praveen

+0

,那麼它就會失敗。你是對的。它從來沒有用於PROD類型的工作。如果我在其中添加更多約束條件,它不會失敗,但是,您的解決方案無疑更好。 – Akshay

相關問題