2011-08-25 61 views
5

我有一個平面文件通過現有的SSIS包導入到SQL Server中。我需要對包進行更改以適應平面文件中的新字段。新字段是格式爲dd-mmm-yy的日期字段(例如,25-AUG-11)。平面文件中的日期字段將爲空(例如空格/空格)或填充日期。我無法控制平面文件中的日期格式。如何在數據導入期間將平面文件中的dd-mmm-y值格式化爲smalldatetime?

我需要導入日期字段的平面文件到現有的SQL Server表和目標字段的數據類型SMALLDATETIME。

我建議導入日期字符串轉換成負載表,然後將來自負載表獲取數據時爲smalldatetime。但是有沒有另一種可能的方法來解析日期格式dd-mmm-yy,以便將該直接加載到smalldatetime字段中,而無需使用從加載錶轉換爲smalldatetime。我不太想如何解析日期格式,特別是月份。歡迎任何建議。

回答

7

下面是可能給你的,你可以做些什麼的想法的例子。理想情況下,在SSIS包或任何ETL作業中,您應該考慮到數據可能並不完全符合您的期望。您需要採取適當的措施來處理可能會立即彈出的錯誤或無效數據。這就是爲什麼SSIS在數據流任務中提出了許多轉換任務,您可以利用它來清理數據。

對您而言,您可以利用Derived Column轉型或Data conversion轉型來實現您的要求。

的例子是在SSIS 2008 R2創建。它顯示瞭如何讀取包含日期的平面文件並加載到SQL表中。

File

我創建了一個簡單的SQL表導入平面文件數據。

Table

在SSIS包,我有一個連接管理器SQL和一個平面文件。平面文件連接的配置如下所示。

Connection

Flat file 1

Flat file 2

Flat file 3

在SSIS包,我置於控制流選項卡上的數據流任務。在數據流任務裏面,我有一個平面文件源,派生列轉換和一個OLE DB目標。由於Flat文件源和OLE DB目標很簡單,我將把它們留在這裏。Derived轉換創建了一個新列,其表達式爲(DT_DBDATE)SmallDate。請注意,您也可以使用數據轉換轉換來執行相同的操作。這個新的SmallDateTimeValue列應該映射到OLE DB Destination中的數據庫列。

Derived column

如果執行這個包,它會失敗,因爲不是所有的文件中的值是有效的。

Failed

爲什麼它在你的情況下,失敗的原因是無效的數據直接插入到表中。在你的情況下,這個表會拋出一個異常使得程序包失敗。在此示例中,程序包失敗,因爲Derived列轉換的默認設置是在組件發生錯誤時使組件發生故障。因此,我們放置一個虛擬變換來重定向錯誤行。我們將爲此目的進行多播轉換。它不會做任何事情。理想情況下,您應該使用您選擇的OLE DB目標或其他目標組件將錯誤行重定向到另一個表,以便分析導致錯誤的數據。

拖動派生轉換中的紅色箭頭並將其連接到組播轉換。這將彈出「配置錯誤輸出」對話框。將錯誤和截斷列下的值從失敗組件更改爲Redirect row。這會將任何錯誤行重定向到組播轉換,並且不會進入表中。

Configure Error output

現在,如果我們執行這個包,它會成功運行。請注意每個方向顯示的行數。

Success

這裏是鑽進了表中的數據。只有2行是有效的。您可以查看顯示文件中數據的第一個屏幕截圖,您可以看到只有2行是有效的。

希望能給你一個想法,在SSIS包中實現你的需求。

Table data

+1

屏幕截圖非常棒,+1 – eddiegroves

3

應該直接加載到SMALLDATETIME領域,因爲它是。請記住,日期只是SQL Server中的數字,它們以所需的日期/時間格式呈現給用戶。作爲日期數據類型,SSIS包應該只讀25-AUG-2011,並將其插入到SMALLDATETIME字段中而不會出現問題。

當時包拋出一個錯誤,還是什麼?

+0

的包被扔轉換錯誤,但有人爲已經告訴我,這可能是因爲它們是空間/空格,所以我需要做一次檢查他們,並插入一個NULL(DT_DATE)的記錄。 – suggy1982

相關問題