2015-02-23 150 views
0

我有一個SSIS包(SQL Server 2008)。我有一個Excel源文件(XLS 97-2003),我想先導入一個SQL表,將所有內容存儲爲字符串(數字和日期存儲爲例如rae)。然後,我從這個表中獲取數據到其他表格。SSIS從Excel到SQL Server:數據類型長度

Excel的源被配置是這樣的:在所述第一步驟中發生Provider=Microsoft.Jet.OLEDB.4.0;Data Source=*********;Extended Properties="EXCEL 8.0;HDR=YES;IMEX=1";

我的問題。讓我解釋一下: 我的一些列MIGHT包含大文本。我確切知道這些列是什麼。

的問題是:

  • 一方面,如果配置了源列被ntext和如果有長文本(> 255字符),然後確定。如果沒有數據是這些列或短文本(< 255 char),或者在前8行後面有長文本,我會收到一個錯誤消息(Excel源代碼中的紅色框...不會再繼續執行)。另一方面,如果源列被配置爲(wstr,255),並且如果沒有數據或短數據(< 255 char),則一切正常。如果有大文本,我會得到一個錯誤(這似乎是合乎邏輯的)。

我想配置我的軟件包,以便在數據源包含比預期更小的數據時不會出錯。在我看來,這是相當合理的,但我無法實現...

任何幫助將不勝感激。

回答

1

根據MSDN文檔SSIS,你應該閱讀這兩個:

缺失值。 Excel驅動程序讀取指定源中的某些行數(默認情況下爲8行),以猜測數據類型 每列 ...有關詳細信息,請參閱PRB:將Excel值返回爲NULL as NULL使用DAO OpenRecordset 。

截斷文本。當驅動程序確定Excel列包含文本數據時,驅動程序將根據其採樣的最長值選擇數據類型(字符串或備註) 。如果驅動程序不在 所取樣的行中發現長度超過255個字符的任何值,則它將該列視爲備註列的255個字符的字符串列,而不是 。因此,長度超過255個字符的值可能會被截斷爲 。 要從備註列中導入數據而不截斷, 必須確保至少一個採樣的 行中的備註列包含的值超過255個字符,或者必須增加驅動程序採樣的行數包括這樣一排。您 可以通過增加 TypeGuessRows值 HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Jet \ 4.0 \ Engines \ Excel註冊表中 密鑰的值來增加採樣的行數。有關詳細信息,請參閱PRB:從Jet 4.0傳輸數據 OLEDB源失敗,帶有錯誤。

因此,似乎要麼你試圖改變在運行Excel源結構(不與Excel的供應商合作),或者你有沒有上面的(即沒有長文本或長文本中列出適合要求數據8行之後)。我想你可以用兩種可能的方法處理這個問題:

  1. 粘貼虛擬NTEXT - 將數據大小寫入這些列。節省很多的神經。您可以在第一行執行此操作,因此在檢查列內容後,Excel提供程序不會受挫。
  2. 使用MSDN鏈接增加行採樣設置。無論如何,如果您在這些專欄中沒有任何文字,那將會失敗。

PS。第三種方法根本不是使用Excel提供程序。將Excel文件保存爲CSV並使用平面文件源,您不會遇到此問題。只有當您100%確定源文件符合所有要求並且永不意外更改其結構時,Excel Source纔是有效的。

+0

坦克的想法!我想我會堅持第一個建議 – Thibault 2015-02-23 21:40:53

+0

該文件頂部的虛擬行是一個工作解決方案。最重要的是,它保證我的其他列(即日期類型)也轉換爲文本,這正是我最初想要的。 – Thibault 2015-02-26 08:55:11