スクリプトタスクを使用してテキストファイルからステージングテーブル(各実行前に切り捨てられます)に行をインポートするために、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の実行タスク内の式を使用してクエリを構築しようとしました。これらの試みのいずれも、私が受け取っているエラーメッセージに何の違いも生じませんでした。
私が試すことができる他の提案はありますか?
プロファイラーのトレースを見て、SSISパッケージがあなたが思っているパラメータ値を送信していることを確認しようとしましたか? –
はい@TabAlleman、パラメータのファイル名は、私が期待しているものです。私はちょうど何かを発見しました - テストのために、私は、格納されたprocファイル内のファイル名をハードコードし、次にSQLのExecuteコマンドからパラメータを削除しました。それは正しく働いた。今私は私のパラメータがVARCHARの場合でも、私はそれをproc内のシングルクォート内にカプセル化する必要があるかもしれないのだろうか?私はより多くのテストをする必要があります... –