1

50以上のExcelファイルを介してExcelループを実行しています。ループは各Excelファイルを通過し、すべてのデータを取得して、エラーなしでデータベースに入力します。EFileこれは、遅延検証をtrueに設定し、Excel接続の式が(ループ内で)何も設定されていないという文字列変数であることを確認する一般的なプロセスです。

動作していないもの:Excelファイルの名前をデータベースに入力しようとしています。

何が試されましたか(編集; SOは私の2を1に変更しました-理由はわかりません):

  1. Excelファイルとデータベース入力の間に派生列を追加し、EFile式を使用して列を追加します(したがって、派生列の式の下では@ [User :: EFile]になります)。空を追加します。ただし、これは空白を何も入力しません(何も入力しません)。

  2. 1つの提案は、別の文字列変数を追加し、そのプロパティEvaluateAsExpressionをTrueに設定し、式をEFile変数(@ [User :: EFile])に設定することでした。面白いのは、これが同じことをすることです-データベースに空白を入力します。

ブログの多くの人がこれができると主張していますが、実際にこれに対処している人は見たことがありません(私はブログを持っており、答えが得られたら間違いなくこれを行う方法を人々に示します。これまでのところ、これらの他の人は落ちています短い)。ループ中にExcelファイルの名前を取得してデータベースに入力するにはどうすればよいですか?

追加:追加するのを忘れました。スクリプトはありません。主張はそれらなしでそれができるということです、それで私はそれらなしで解決策を見たいです。

:Excelファイルからデータをインポートする機能はすでにあります-それは簡単です(あらゆる種類のtxt、csv、xls、xlsxデータをインポートするための2つの異なるプロジェクトがあるため、GitHubアカウントを参照してください)。データベースにもインポートされているファイルの実際の名前も取得しようとしています。したがって、各ファイルのデータとともに50個のExcelファイルがある場合、データベースにはそのデータと一緒に50個のファイル名があります(したがって、各ファイルに1000行のデータがある場合、各1000行にもファイルの名前があります。それらは追加の列としてそれらの隣から来ました)。この点は、私がファイルにデータをインポートするのに問題があると人々が思っているので、多くの混乱を引き起こしているようです-いいえ、私のGitHubを参照してください。繰り返しますが、それは簡単です。インポートする必要があるのはFILENAMEです。

テストパッケージ:https ://github.com/tmmtsmith/SSISLoopWithFileName

解決:@jaimetは、派生列は@ [User :: CurrentFile]である必要があることを指摘しました(テストパッケージを参照)。パッケージを最初に実行したとき、データベースに空白の値が残っていました。ただし、最初に接続を設定するときは、実際のファイルをポイントし(これを「パッケージのだまし」と呼びます)、後で接続の式を空白の@ [User::CurrentFile]に変更します。変数@[User:: CurrentFile]を使用した派生列は、0の文字列を示しました。そこで、派生列を削除し、完全なファイルパスと名前を変数に入れてから、変数を派生列に追加しました(文字列の長さが91文字であると思わせた後、戻って変数を何も設定しませんでした(英語の先生は今のところTHENを嫌うでしょう)。パッケージを実行すると、ファイルのフルパスが入力されました。多分、

すべての助けに感謝します。

4

4 に答える 4

5

この問題は、変数の値が空白であることが@[User::FileNameInput]原因であり、これにより、SSISパッケージは、派生列変換でこの変数の値が常に長さがゼロであると想定していました。

オリジナル

派生列変換の式をからに変更し@[User::FileNameInput]ます(DT_STR, 2000, 1252)@[User::FileNameInput]

派生列を型キャストして2000、列の長さをその最大値に設定します。値1252はコードページを表します。ANSIコードページを使用していると仮定しました。2000FilePath列に変数VARCHAR(2000)があったため、テーブル定義から値を取得しました。列のデータ型がNVARCHAR(2000)の場合、式は次のようになります。(DT_WSTR, 2000)@[User::FileNameInput]

新しい表現

于 2013-01-28T17:56:07.280 に答える
1

ループを使用ForEachしてフォルダー内のファイルを処理している場合は、SSIS Junkieのブログで説明されている手法を使用して、ファイル名をSSIS変数に取り込みました。SSIS:Foreachループでのファイルの列挙

フローの後半で変数を使用して、データベースに書き込むことができます。

于 2013-01-18T22:38:37.333 に答える
1

すべての意図と目的に対して、あなたの方法#1は機能するはずです。それはまさに私がそれをやろうとする方法です。なぜそれが機能しないのか、私は困惑しています。あなたはおそらくあなたのパッケージを共有できますか?

トニー、リンクありがとうございます。とても有難い。

よろしくジェイミー

于 2013-01-26T20:37:52.520 に答える
1

ティム、

派生列コンポーネントで間違った変数を使用しています。ファイル名を@[User:: CurrentFile]に保存していますが、派生列コンポーネントで使用している変数は@ [User::FileNameInput]です。

@ [User :: CurrentFile]を使用するように派生列コンポーネントを変更すると、問題がなくなります。

お役に立てば幸いです。

JT

于 2013-01-28T17:19:15.857 に答える