2009-02-12 146 views
16

當在SSIS中使用Excel數據源時,每個單獨列的數據類型都來自列中的數據。是否有可能重寫這種行爲?SSIS Excel數據源 - 是否可以重寫列數據類型?

理想地,我們想從Excel源遞送至是字符串數據類型每列,以便數據驗證可以在數據流中後面的步驟中從所述源接收的數據來執行。

目前,錯誤輸出選項卡可以被用於忽略轉換失敗 - 有問題的數據然後被空,包將繼續執行。但是,我們想知道原始數據是什麼,以便可以爲該行生成適當的錯誤消息。

+0

我已經回答了一個在另一個類似於您的線索的問題,請參閱下面的鏈接。 http://dba.stackexchange.com/questions/39252/ssis-keeps-force-changing-excel-source-string-to-float/149378#149378 – user1968485 2016-09-15 05:42:56

回答

8

是的,你可以。只需進入Excel源的輸出列列表並設置每個列的類型。

要到輸入列列表中右鍵單擊Excel源上,選擇「顯示高級編輯器」,點擊標記爲「輸入和輸出屬性」選項卡。

一個可能更好的解決方案是使用派生列分量在那裏你可以真正建立「新的」列在Excel中的每一列。這具有以下優點:

  1. 您可以更好地控制轉換的內容。
  2. 你可以把在控制權發生變化的規則(即,如果空給我一個空字符串,但如果有數據然後給我的數據作爲一個字符串)
  3. 您的數據源不直接依賴於其他地區該過程(即,您可以更改源和唯一需要做的工作是在派生列中)
+0

羅伯特 - 感謝您的回覆 - 我仍然有一個看到如何做到這一點的問題。我正在使用具有列形式的Excel Source組件,但它只有每個列的名稱,而不是數據類型。就我所見,Excel連接管理器沒有列形式。 – 2009-02-12 11:33:40

+0

我想你要去錯誤的屬性編輯器(Excel源碼有兩個,一個簡單和先進的)。我已經更新了答案,並稍微澄清了一些問題,並逐步找到了正確的地方。 – 2009-02-12 11:50:41

+7

現在到達 - 我已經使用高級編輯器,並將輸入和輸出列更改爲全都具有DT_WSTR的數據類型。但是,錯誤輸出列數據類型必須與輸入列數據類型匹配,並且似乎無法更改這些...感謝您的持續幫助! – 2009-02-12 12:22:02

7

如果您的Excel文件在第一行數據中的問題列中包含一個數字,看來SSIS引擎會將類型重置爲數字類型。它不停地重置我的。我進入我的Excel文件,並通過在他們面前放置單引號將數字更改爲「以文本形式存儲的數字」。現在他們被讀作文本。

我還注意到SSIS使用第一行IGNORE程序員指出的是數據的實際類型(我甚至告訴Excel將整列格式化爲TEXT,但SSIS仍使用數據,這是一個一堆數字),並重置它。當我在第一行數據前的Excel文件中加入一個單引號時,我認爲它會正確,但不是,還有額外的工作。

事實上,即使SSIS外部數據源列現在有類型DT_WSTR,它仍然會讀取43567192爲4.35671E + 007。所以你必須回到你的Excel文件,並把所有數字前面的單引號。

漂亮的LAME,微軟!但是有你的解決方案。如果Excel文件不在您的控制範圍內,我不知道該怎麼辦。

-2

您可以使用數據轉換組件轉換爲所需的數據類型。

-1

我在這裏實施解決方案時遇到了麻煩 - 我可以按照說明進行操作,但它只給出新的錯誤。

我通過使用數據轉換實體解決了我的轉換問題。這可以在數據流轉換下的SSIS工具箱中找到。我在Excel Source和OLE DB Destination之間放置了數據轉換,將Excel鏈接到Data C,將Data C鏈接到OLE DB,雙擊Data C打開數據列表。給問題列一個新的別名,並更改了數據類型列。

最後,在OLE DB目標的映射中,使用別名列名稱,而不是原始Excel列名稱。任務完成。

2

Excel來源是SSIS表現瘋狂。 SSIS通過讀取前10行來確定特定列中的數據類型。因此,這個問題。如果您在前10個roes中具有空值的文本列,則SSIS將數據類型視爲Int。經過一番努力,這裏有一個解決方法

  1. 在工作表中插入一個虛擬行(最好是第一行)。我喜歡做這個直通腳本任務,你可以考慮使用一些服務來預處理文件SSIS連接到它

  2. 隨着duummy行之前,你是確保數據類型將根據您的需要進行設置

  3. 使用Excel源代碼讀取數據並在將其用於進一步處理之前過濾出虛擬行。

我知道這是一個有點簡陋,但它的工作原理:)

0

我能解決這個問題。在創建SSIS包的同時,我手動將特定的列更改爲文本(打開excel文件選擇列,右鍵單擊列,選擇格式單元格,在數字選項卡中選擇Text並保存Excel)。 現在創建SSIS包並進行測試。有用。現在嘗試使用未將該列設置爲文本的excel文件。

它爲我工作,我可以成功地執行包。

8

根據this blog post,問題是,SSIS Excel驅動程序基於所述前8行的讀取值確定每個列的數據類型:

  • 如果頂部8記錄包含相等數目的數字和字符類型 - 然後優先級是數字
  • 如果大多數前8條記錄都是數字,則它將數據類型指定爲數字,並將所有字符值讀取爲NULL
  • 如果大多數前8條記錄是字符類型它分配的數據類型爲字符串,所有數值都理解爲 空值

的職位概述了兩件事情可以做,以解決這個問題:

  1. 首先,添加IMEX=1到年底你的Excel驅動連接字符串。這將允許Excel將值讀爲Unicode。但是,如果前8行中的數據是數字,這是不夠的。
  2. 在註冊表中,將HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Nod\Microsoft\Jet\4.0\Engines\Excel\TypeGuessRows的值更改爲0.這將確保驅動程序查看所有行以確定該列的數據類型。
1

我正在尋找類似問題的解決方案,但沒有在網上找到任何東西。雖然大多數找到的解決方案都是在設計時運行的,但當您想要自動化SSIS包時,它們不起作用。

我解決了這個問題,並通過更改「Excel Source」的屬性使其工作。默認情況下,AccessMode屬性設置爲OpenRowSet。如果您將其更改爲SQL Command,則可以編寫自己的SQL以根據需要轉換任何列。

對我來說是SSIS治療NDCCode列浮動,但我需要它作爲一個字符串,所以我用下面的SQL:

Select [Site], Cstr([NDCCode]) as NDCCode From [Sheet1$] 

enter image description here

enter image description here

相關問題