Sql-Server

使用 SSIS 從 Excel 導入大列(8000 個字元)

  • May 2, 2016

我正在嘗試設置我們從供應商處獲得的 Excel 電子表格的正常導入。我正在使用 SQL 2008 R2 SSIS 將其導入表中。問題連接管理器是到電子表格的 OLE DB 連接。電子表格是 Excel 2005。數據庫連接管理器使用的是 Native OLE DB\SQL Native Client。

我遇到的問題是 OLE DB 源不斷將幾個 excel 列設置DT_WSTR255長度。我有 2 列,但是分別是 4000 和 8000 個字元。我已經進入 OLE DB 源的Advanced Editor/Input and Output Properties選項卡並更改了External Columns列表和Output Columns列表中的數據類型/長度。不幸的是,當我離開時Advanced Editor,錯誤列表中會出現錯誤。

Validation error. Data Flow Task: Data Flow Task: The output column "ColumnName" (226)
on the error output has properties that do not match the properties of its 
corresponding data source column.

當我再次點擊源時,我會得到一個自動“修復”錯誤的選項。然後我選擇“是”和“確定”。錯誤現在消失了,但是當我回到External Columns數據類型/長度設置時又回到原來的DT_WSTR/255.

我可以手動將電子表格更改為分隔文件以避免該問題,但不想在流程中添加手動步驟。有誰知道獲取 Excel 源以允許長列的方法?

我們終於解決了這個問題。事實證明,SSIS 是根據 excel 文件中的前幾行來計算長度的。當我們將具有較長數據的行移到頂部時,列更改為 unicode 文本(允許額外的長度)。

您可以在行中將大文本拆分為較小的塊並將它們載入到 foreach 循環容器中,

Declare @maxRowLength int = 50;
with x as (
select 'Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry''s standard dummy text ever since the 1500s. Over the years, sometimes by accident, sometimes on purpose (injected humour and the like).' data
),
tmp(data,c,rn) as (
select data,SUBSTRING(data, 1,@maxRowLength),@maxRowLength
from x
union all
select data,SUBSTRING(data,rn,@maxRowLength),rn + @maxRowLength
from tmp
where rn < len(data)
)
select c,rn from tmp
OPTION (MAXRECURSION 500);

更多資訊張貼在這裡

引用自:https://dba.stackexchange.com/questions/47248