0

スクリプトタスクを使用してテキストファイルからステージングテーブル(各実行前に切り捨てられます)に行をインポートするために、SQL 2012でSSISパッケージを開発し、 。次に、Execute SQLタスクを使用してストアドプロシージャを実行します。ストアドプロシージャはステージングテーブルをクエリし、最終テーブルに挿入するためにデータをフォーマットします。ストアドプロシージャがSQL実行タスクで失敗しましたが、手動で成功しました

現在、私は2つの異なるファイルでのみテストしています。これらのファイルは、私がOutlookでテキストファイルとして保存するように設定した別々の電子メールです。各ファイルの名前は、YYYYDDMM_HHMMSS_ [filename] .txtのように変更されます。私のSSISパッケージは、For Eachループを使用してこのファイル名を変数@AckFileNameに割り当てます。これはストアドプロシージャに渡され、そこからファイルdatetimeを解析します。

だから私のストアドプロシージャの最初の行は次のとおりです。

SELECT DISTINCT CONVERT(datetime,left(@AckFileName,8)+' '+substring(@AckFileName,10,2)+':'+substring(@AckFileName,12,2)+':'+substring(@AckFileName,14,2)) 

私はSSMSでストアドプロシージャを実行すると、それが正常に動作します。しかし

Exec [dbo].[ParseAckFile] @AckFileName 

、私は同じ、同一のコードを持っているにもかかわらず私のSQL文を実行SQLタスクで、次のエラーが表示されます。

"Exec [dbo].[ParseAckFile]..." failed with the following error: "Conversion failed when converting date and/or time from a character string." 

これはシンプルで分かりやすいですね。ストアドプロシージャのクエリは文字列をdatetimeに変換することを除いて、手動で正しく実行するとエラーが返されるはずです。私はこれを各ファイルでテストした結果は同じです。どちらのファイルでもprocはうまく動作しますが、SQLの実行タスクは失敗します。

さらに、最終テーブルへのOLEDBまたはADO.NET接続を使用してSQL実行タスク内でDelay Validation = Trueを設定し、SQLの実行タスク内の式を使用してクエリを構築しようとしました。これらの試みのいずれも、私が受け取っているエラーメッセージに何の違いも生じませんでした。

私が試すことができる他の提案はありますか?

+0

プロファイラーのトレースを見て、SSISパッケージがあなたが思っているパラメータ値を送信していることを確認しようとしましたか? –

+0

はい@TabAlleman、パラメータのファイル名は、私が期待しているものです。私はちょうど何かを発見しました - テストのために、私は、格納されたprocファイル内のファイル名をハードコードし、次にSQLのExecuteコマンドからパラメータを削除しました。それは正しく働いた。今私は私のパラメータがVARCHARの場合でも、私はそれをproc内のシングルクォート内にカプセル化する必要があるかもしれないのだろうか?私はより多くのテストをする必要があります... –

答えて

0

すべての午後のテストに費やした後、私は最後に問題の原因を突き止めました。私のFor Eachループが最終的にこのストアドプロシージャに渡したファイル名を取得していたので、それは完全なUNCパス/ファイル - 私が知っていた。しかし、SSISで変数値を表示すると、スクリプトタスク - \\ [server \ [folder \ [subfolder] \ [filename] - で使用されている形式でパス名が表示されていたので、誤ってREPLACEコマンドの正確な構文を使用しました。ストアドプロシージャは@AckFileName変数を更新して、それを挿入クエリに渡します。エラーを見つけて修正したら、パッケージは正常に動作します!

関連する問題