web-dev-qa-db-ja.com

SSIS Excelデータソース-列のデータ型をオーバーライドすることは可能ですか?

SSISでExcelデータソースを使用する場合、個々の列のデータ型は列のデータから取得されます。この動作をオーバーライドすることは可能ですか?

理想的には、Excelソースから配信されるすべての列を文字列データ型にして、データフローの後のステップでソースから受信したデータに対してデータ検証を実行できるようにします。

現在、[エラー出力]タブを使用して、変換の失敗を無視できます。問題のデータはnullになり、パッケージは引き続き実行されます。ただし、その行に対して適切なエラーメッセージを生成できるように、元のデータが何であったかを知りたいと思います。

18
Hugh Mullally

はい、できます。 Excelソースの出力列リストに移動し、各列のタイプを設定するだけです。

入力列リストを表示するには、Excelソースを右クリックし、[高度なエディターを表示]を選択して、[入力と出力のプロパティ]というラベルの付いたタブをクリックします。

潜在的により良い解決策は、Excelの各列に「新しい」列を実際に作成できる派生列コンポーネントを使用することです。これには次の利点があります

  1. 何に変換するかをより細かく制御できます。
  2. 変更を制御するルールを設定できます(つまり、nullの場合は空の文字列を取得しますが、データがある場合はデータを文字列として取得します)
  3. データソースは、残りのプロセスに直接関連付けられていません(つまり、ソースを変更でき、作業を行う必要があるのは派生列のみです)。
11
Robert MacLean

このブログ投稿 によると、問題は、SSISExcelドライバーが最初の8行の読み取り値に基づいて各列のデータ型を決定することです。

  • 上位8レコードに同数の数値タイプと文字タイプが含まれている場合、優先順位は数値です
  • 上位8レコードの大部分が数値の場合、データ型が数値として割り当てられ、すべての文字値がNULLとして読み取られます。
  • 上位8レコードの大部分が文字タイプである場合、データタイプを文字列として割り当て、すべての数値がNULLとして読み取られます。

この投稿では、これを修正するためにできる2つのことについて概説しています。

  1. まず、Excelドライバーの接続文字列の最後にIMEX=1を追加します。これにより、Excelは値をUnicodeとして読み取ることができます。ただし、最初の8行のデータが数値の場合、これでは不十分です。
  2. レジストリで、HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Nod\Microsoft\Jet\4.0\Engines\Excel\TypeGuessRowsの値を0に変更します。これにより、ドライバーがすべての行を調べて、列のデータ型を判別できるようになります。
10
Ryan Kohn

Excelファイルのデータの最初の行の問題の列に数値が含まれている場合、SSISエンジンは型を数値型にリセットするようです。それは私のものをリセットし続けました。 Excelファイルに移動し、数字の前に一重引用符を付けて、数字を「テキストとして保存された数字」に変更しました。それらはテキストとして読み取られるようになりました。

また、SSISが最初の行を使用して、プログラマーがデータの実際のタイプであると示したものを無視していることにも気付きました(Excelに列全体をTEXTとしてフォーマットするように指示しましたが、SSISはまだデータを使用していました。これは数字の束でした) 、リセットします。 Excelファイルのデータの最初の行の数値の前に一重引用符を入れて修正すると、正しくなると思いましたが、追加の作業はありません。

実際、SSIS外部データソース列のタイプはDT_WSTRになりましたが、43567192は4.35671E +007として読み取られます。したがって、Excelファイルに戻って、すべての数値の前に一重引用符を付ける必要があります。

かなりLAME、マイクロソフト!しかし、あなたの解決策があります。 Excelファイルが管理されていない場合の対処方法がわかりません。

9
Dave Scotese

同様の問題の解決策を探していましたが、インターネット上で何も見つかりませんでした。見つかったソリューションのほとんどは設計時に機能しますが、SSISパッケージを自動化する場合は機能しません。

この問題を解決し、「Excelソース」のプロパティを変更して機能させました。デフォルトでは、AccessModeプロパティはOpenRowSetに設定されています。 SQL Commandに変更すると、独自のSQLを記述して、任意の列を自由に変換できます。

私にとって、SSISはNDCCode列をfloatとして扱っていましたが、文字列として必要だったため、次のSQLを使用しました。

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

enter image description here

enter image description here

4
Alok B

ExcelのソースはSSISがおかしな振る舞いです。 SSISは、最初の10行を読み取ることにより、特定の列のデータのタイプを判別します。したがって、問題が発生します。最初の10個のroesにnull値を持つテキスト列がある場合、SSISはデータ型をIntとして受け取ります。少し苦労して、ここに回避策があります

  1. ワークシートにダミー行(できれば最初の行)を挿入します。私はこれをスクリプトタスクで行うことを好みます。SSISがファイルに接続する前に、何らかのサービスを使用してファイルを前処理することを検討してください。

  2. ダミー行を使用すると、データ型が必要に応じて設定されることが確実になります

  3. Excelソースを使用してデータを読み取り、ダミー行をフィルターで除外してから、さらに処理します。

私はそれが少しぼろぼろであることを知っています、しかしそれは働きます:)

3
user3366772

この問題を修正できます。 SSISパッケージの作成中に、特定の列を手動でテキストに変更しました(Excelファイルを開いて列を選択し、列を右クリックしてフォーマットセルを選択し、[番号]タブで[テキスト]を選択してExcelを保存します)。次に、SSISパッケージを作成してテストします。できます。ここで、この列がテキストとして設定されていないExcelファイルを使用してみてください。

それは私のために働き、私はパッケージをうまく実行することができました。

0
user3397876