web-dev-qa-db-ja.com

不適切な列タイプを強制するSSIS Excelインポート

SSISを使用してデータベースにスプレッドシートをインポートしようとしています。何らかの理由で、SSISは、2つの列に文字データが含まれている場合、2つの列がDouble型であると考えています。列をnvarchar(255)に再マッピングしようとしましたが、文字が含まれているため、二重だと思われるデータを選択したくありません。 SSISパッケージを編集してExcelソースの列の種類を変更しようとすると、エラー出力の列の種類を変更できず、通常の出力列とエラー出力列が変更されない場合にエラーが発生します一致。

SSISがこれらの列がDoubleであると主張しているのはなぜですか?これらが文字列であることをどのように強制することができますか?マイクロソフトのすべてが正しく機能しない必要があるのはなぜですか?

編集:

私はこれを見つけました:

混合データ型が一番上になるようにデータをソートし、次のことを推測します。問題reversed。文字データをインポートしない代わりに、純粋に数値データのインポートを停止しました。どうやら12345は文字列として表現できるとは思わないようです...

49
CodeRedick

この問題は以前に見たことがありますが、SSISではなくExcelの問題です。 Excelは最初の数行をサンプリングし、明示的にテキストに設定した場合でもデータ型を推測します。必要なことは、これをSSISパッケージのExcelファイル接続文字列に入れることです。この命令は、列に混合データ型が含まれていることをExcelに伝え、実際に列が数値型ではないと判断する前に、追加のチェックを行うように指示します。

;Extended Properties="IMEX=1"

これで動作するはずです(ほとんどの場合)。より安全な方法は、Excelデータをタブ区切りテキストにエクスポートし、SSISを使用してインポートすることです。

41
James

列データをテキストに変換(つまり、強制)できます...これを試してください(注:これらの手順はExcel 2007に基づいています)...

次の手順により、Excelは列をテキストとして処理するようになります。

Excelでスプレッドシートを開きます。

列ヘッダーをクリックして、「ほとんど数値データ」を含む列全体を選択します。

リボンメニューの[データ]タブをクリックします。

「列へのテキスト」を選択します。これにより、テキストを列に変換ウィザードが表示されます。

-ステップ1:[次へ]をクリックします

-ステップ2:[次へ]をクリックします

-ステップ3:テキストを選択して、[完了]をクリックします

Excelシートを保存します。

SQL Server 2005データインポートウィザードを使用してインポートを再試行します。

また、追加の回答がある別の質問へのリンクもあります。

データのインポートWizard列に選択したデータ型が気に入らない

33
Joe L.

受け入れられた答えに言及されていないことの1つは、「IMEX = 1」パラメーターを指定する必要があることですinsideの引用部分:

...;Extended Properties="...";
13
RolandTumble

; IMEX = 1;常に動作しません... Excelの混合データ型に関するすべて: Excel列の混合データ型

enter image description here

8
Joost

別の回避策は、文字データを上部に持つスプレッドシートを並べ替えることで、Excelが列を文字列として認識し、すべてをインポートすることです。

5
marks.chimp

また、レジストリを変更して、最初の8行以外の値を表示することもできます。私はこの方法を使用しており、非常にうまく機能しています。

http://support.Microsoft.com/kb/281517

3
Jeremy C

私はしばらくの間、この問題で頭を壁にぶつけていました。私たちの環境では、サプライヤからのさまざまな形式の価格ファイルを使用しますが、その中には100万件以上のレコードを持っているものもあります。この問題は通常、次の場所で発生します。

  • OLEDBドライバーによってスキャンされた行に数字が含まれているように見えますが、レコードセットの後半で混合値が含まれているか、または
  • フィールドには数字のみが含まれますが、ソースにはテキストとしてフォーマットされたものがあります(通常はExcelファイル)。

問題は、外部入力列を目的のデータ型に設定した場合でも、パッケージを実行するたびにファイルがスキャンされ、OLEDBドライバーがフィールドのあるべきものと動的に変更されることです。

通常、ソースファイルにはフィールドヘッダー(テキスト)と価格(数値フィールド)が含まれているため、簡単に解決できます。

最初のステップ:

  • SQLステートメントを変更して、ヘッダーフィールドを含めます。これにより、SSISは価格フィールドを含むすべてのフィールドをテキストとして表示します。

混合フィールドの場合:

  • フィールドがテキストになったため、最初の問題は解決しましたが、出力にはまだヘッダー行があります。
  • SQL WHERE句を変更してヘッダー値を除外することにより、ヘッダー行が出力に含まれないようにします。 「WHERE NOT([F4] = 'Price')」

数値フィールドの場合:

  • OLE DBソースの高度なエディターを使用して、価格フィールド(またはその他の数値フィールド)の出力列を数値DataTypeに設定します。これにより、これらのフィールドにテキストを含むレコードがヘッダーレコードを含めて失敗しますが、テキストとして保存された数値の変換を強制します。

  • エラー出力を設定して、数値フィールドの失敗を無視します。

  • または、リダイレクトされた数値フィールドで引き続きエラーが必要な場合は、SQL WHERE句を変更してヘッダー値を除外してヘッダー行を削除し、

  • このフィールドでエラーをリダイレクトするには、エラー出力を設定します。

明らかに、このメソッドはヘッダーフィールドがある場合にのみ機能しますが、うまくいけばこれはあなたの一部を助けます。

1
Ryno

次のレシピを使用しました。

  1. ExcelからAccessにデータをインポートする
  2. AccessからSQL Serverへのデータのインポート

そしてそれは私のために働いた...

1
aldy sefan

まあIMEX = 1は私のために機能しませんでした。 Reynier Booysenの提案もなかった。 (違いがあるかどうかはわかりませんが、SQL Server 2008r2を使用しています)。いくつかの回避策の良い説明と、IMEX = 1が各スプレッドシートの最初の8行に制限されている理由の説明は http://social.msdn.Microsoft.com/Forums/en-USにあります。/sqlintegrationservices/thread/78b87712-8ffe-4c72-914b-f1c031ba6c75

お役に立てれば

1
Alan Merriam

同じ問題がありました。問題はExcel Sourceタスクにあります。このタスクを初めてセットアップするとき、タスクは指定されたExcelファイルに(Excel接続を介して)接続し、現在のスプレッドシートに基づいて各列のタイプを決定します。

したがって、Excel Sourceタスクを設定する場合は、テキストであるはずの列の列にのみテキストがあることを確認してください。つまり、Excel Sourceタスクは、後続のスプレッドシートが同じ形式であると常に想定し、テキストとして12345を読み取りますこれは、タスクが設定されたときに列がテキストだったためです。

それが理にかなっていることを願っています!

0
Reynier Booysen

パッケージのエラーの原因を理解するのに少し時間がかかりました。最終的に、データがnull(Example: from "06" to "NULL")、ソースファイル接続のプレビューでこれを見つけました(Excel Source> Edit> Connection Manager> Sheet='MySheet'> Preview...)。 Jamesの投稿を読んで、接続文字列を編集して拡張プロパティを追加したとき、私は興奮しました:;Extended Properties="IMEX=1"。しかし、それは私にはうまくいきませんでした。

Excelワークシートのセル形式を「数値」から「テキスト」に変更することでエラーを解決できました。形式を変更した後、アップロードプロセスは正常に実行されました!私の接続文字列は次のようになります:Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\\myServer\d$\Folder1\Folder2\myFile.xlsx;Extended Properties="Excel 12.0 XML;HDR=NO";

エラーメッセージを解決したスクリーンショットを次に示します。

エラーExcelファイル接続のメタデータenter image description here

エラーの原因「一般」形式enter image description here

エラーの原因が変更されました「テキスト」形式enter image description here

エラー修正Excelファイル接続のメタデータenter image description here

同じ問題がありました。単一の列に複数のデータ型の値があり、パッケージは数値のみをロードします。 nullとして更新されたものはすべて残ります。

ソリューション

これを解決するには、Excelデータ型を変更することが解決策の1つです。 Excelで列データをコピーに別のファイルに貼り付けます。 その列を削除するおよびTextデータ型として新しい列を挿入するそして、コピーしたデータを新しい列に貼り付けます。

現在、ssisパッケージではExcelソースを削除して再作成で、宛先テーブルは列を変更varcharとしてのデータ型です。

これは動作します。

これは私のために働いた。 Excelで問題のある列を選択します-列全体を強調表示します。形式を「テキスト」に変更します。 Excelファイルを保存します。

SSISパッケージで、インポートの[データフロー]ウィンドウに移動します。 Excel Sourceノードをダブルクリックします。タイプが変更されたことを警告し、それらを再マップするかどうか尋ねます。はいをクリックします。これで実行が機能し、すべての価値がもたらされるはずです。

注:Excel 2013とVisual Studio 2015を使用していますが、これらの手順は以前のバージョンでも機能すると想定しています。

0
jaycer
  1. リボンメニューの[ファイル]をクリックし、[オプション]をクリックします。
  2. [詳細設定]をクリックし、[このブックを計算するとき]で[表示される精度を設定する]チェックボックスをオンにして、[OK]をクリックします。

  3. OKをクリックします。

  4. ワークシートで、書式設定するセルを選択します。

  5. [ホーム]タブで、[番号]の横にある[ダイアログボックスランチャーボタン]イメージをクリックします。

  6. [カテゴリ]ボックスで、[番号]をクリックします。

  7. [小数位]ボックスに、表示する小数点以下の桁数を入力します。

オプション1. Visual Basicを使用して各列を反復処理し、各列をテキストとしてフォーマットします。

テキストから列へのメニューを使用し、デリミネーションを変更せずに、「一般」を「テキスト」に変更します

0
Aaron Ireland

Excelスプレッドシートに複数の列が同じ名前で存在する場合、この種のエラーが発生します。パッケージは、列名を区別した後に機能します。列名の確認中に非表示列が無視される場合があります。

0