Excelにはテキストであるはずの列がありますが、SSISはそこに数値テキストを認識して、自動的に倍精度浮動小数点数にします[DT_R8]。
出力ブランチの[外部]列と[出力]列で手動で変更できますが、エラー出力では、それぞれの列を変更できません。
Error at Extract Stations [Excel Source [1]]: The data type for "output "Excel Source Error Output" (10)" cannot be modified in the error "output column "Group No" (29)".
Error at Extract Stations [Excel Source [1]]: Failed to set property "DataType" on "output column "Group No" (29)".
パッケージxmlを変更してみました。 IMEX=1
およびtypeguessrow=0
しかし、どれも私の問題を解決していません。これには修正がありますか?データ型を推測する前に、Excelがデフォルトの8行以上を読み取るようにレジストリを変更することを提案する記事もあります。この方法を使用したくない場合でも、パッケージを実行する予定のマシンでレジストリを変更する必要があるためです。
SQLのnvarcharフィールドにインポートされるExcelフィールドは、たとえば次のようになります。
295.3
296.33
しかし、それらはSQLテーブルに次のように書き込まれます。
295.30000000000001
296.32999999999998
私はデータビューアを入れ、フィールドが表示されます
295.3
296.33
正しい実行ですが、OLE DB Destination sourceにヒットすると、どういうわけかそれを
295.30000000000001
296.32999999999998
それは間違っています。
また、たとえばV321.1やV213.34などの値もあり、これらは完全に整数ではなく、varcharとして格納する必要があります。
この問題を修正する方法はないようです。 Excelは列のデータの最初の数行を確認し、常にデータ型をFLOATに強制します。最初の数行(8以上)にいくつかのvarchar文字を含むテンプレートを作成するための解決策が与えられたので、Excelはそれをデータ型として選択し、データをインポートします。私がSource Safeを使用しているため、ファイルを「チェックイン」してパッケージファイルを「読み取り専用」にできるので、Visual Studioが定義済みのデータ型を変更できません。
テキストファイルのようにインポートでき、この問題がない.csvファイルとしてファイルを取得することはできますか? SSISとExcelは多くのレベルで一緒にうまく動作しないため、通常はすべてのExcelファイルをキックバックして別の形式を要求します。
ステップ1:IMEX=1; MAXROWSTOSCAN=0
を接続文字列に追加します(例:Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Source\filename.xlsx;Extended Properties="Excel 12.0 XML;HDR=YES;IMEX=1; MAXROWSTOSCAN=0"
)。
ステップ2:ソリューションを閉じます。テキストエディターでSSISパッケージを開き、定義済みのデータ型に逆戻りし続けた列を見つけます。 XMLファイルで手動で更新して、目的の形式にします。
ステップ3:SQL Serverデータツールでパッケージを開いて実行します。これで、ファイルからデータをそのままロードできるようになります。