web-dev-qa-db-ja.com

SSISを使用してExcelから大きな列(8000文字)をインポートする

ベンダーから入手したExcelスプレッドシートの定期的なインポートを設定しようとしています。 SQL 2008 R2 SSISを使用してテーブルにインポートしています。問題の接続マネージャーはOLEスプレッドシートへのDB接続です。スプレッドシートはExcel 2005です。データベース接続マネージャーはNative OLE DB\SQL Native Clientを使用しています。

私が得ている問題は、OLE DB SourceがExcel列のいくつかをDT_WSTRの長さの255に設定し続けていることです。ただし、2つの列がありますが、それぞれ4000文字と8000文字です。 OLE DB SourceのAdvanced Editor/Input and Output Propertiesタブに入り、External ColumnsリストとOutput ColumnsリストのDataType/Lengthを変更しました。残念ながら、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.

ソースをもう一度クリックすると、エラーを自動的に「修正」するオプションが表示されます。次に、「はい」と「OK」を選択します。エラーはなくなりましたが、External Columnsに戻ると、データ型/長さの設定は元のDT_WSTR/255に戻ります。

問題を回避するために手動でスプレッドシートを区切られたファイルに変更することはできますが、プロセスに手動のステップを追加したくありません。誰かが長い列を可能にするExcelソースを取得する方法を知っていますか?

7
Kenneth Fisher

ようやく問題を解決しました。 SSISはExcelファイルの最初の数行に基づいて長さを計算することがわかります。長いデータを含む行を一番上に移動すると、列がUnicodeテキストに変わりました(追加の長さを考慮して)。

5
Kenneth Fisher

大きなテキストを行で小さなチャンクに分割し、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);

投稿された詳細情報 ここ

0
abdkok