レポートIDを介してループコンテナを使用してSSIを使用して個別のCSVファイルを作成します
-
27-10-2019 - |
質問
SSISに関しては、私はまだ初心者だと言って、これを序文にしましょう。 Excelで作成され、ユーザーのリストに電子メールで作成される13のクエリがある現在のMSアクセスプロセスを置き換えようとしています。
私のSSISパッケージは、レポート名、電子メールDISTリスト、レポートデータ、CSVファイルを作成してから、それぞれの電子メールを送信する必要があります。
SQL Serverで以下を作成しました。
- レポート付きのテーブル - それぞれにReportIDがあります
- ユーザーのメールアドレスを備えたテーブル
- ユーザーを各レポートにリンクする結合テーブル
- ReportIDを渡すときに保存されたPROCを作成し、電子メールDISTリストと、メールを送信したときに使用するレポートの詳細を返します
- ReportIDを渡す保存されたProcを作成しました。その見返りに、私はそのレポートのいずれかの値を取得します。各レポートには、異なる列のデータを返す異なるクエリがあります。
また、以下を実行するSSISパッケージを作成しようとしました。
- を使用して
Execute SQL Task
アクティブなレポートIDのリストを取得します - a
Foreach Container Loop
に設定ADO Enumerator
各レポートIDをループします - an
Execute SQL Task
これにより、各レポートIDのレポートの詳細と電子メールDISTリストを返します。
それから私はaを配置しようとしました Data Flow Task
ループの内側と保存されたPROCを実行して、各レポートIDのレポートデータを返しますが、エラーメッセージが表示されています。
Error: SSIS Error Code DTS_E_OLEDBERROR. An OLE DB error has occurred.
Error code: 0x80040E55. An OLE DB record is available.
Source: "Microsoft SQL Server Native Client 10.0" Hresult: 0x80040E55 Description: "Column does not exist.".
このエラーは、私の列が各レポートで同じではないためだと思います。その場合、進める方法について何か提案はありますか?
各レポートを通過するには、SSISパッケージでどのような手順を使用する必要がありますか?各レポートを実行するには、個別のSSISパッケージを作成する必要がありますか?
これを1つのパッケージで実行できる場合、生成するCSVレポートのそれぞれに対してフラットファイル接続マネージャーを作成する必要がありますか?
解決
あなたのアプローチは健全だと思います、あなたはステップ3で何か違うことをする必要があります sp_send_dbmail オプションかもしれません(SQLタスクを実行して呼び出します)。
#6クエリを@queryパラメーター(@query = "dbo.makeroport @reportid = 10 ')および @attach_query_result_as_file = 1に割り当てることができます。クエリの結果をCSVとしての受信者。
式を使用して、最初のクエリと出来上がりの結果に基づいて、CC、およびBCCを設定します。
他のヒント
レポートに異なる列がある場合、それぞれに異なるデータフローが必要になります。それでも同じforeachループでそれらを実行したい場合は、実行するときに入力される「ReportType」のような変数を持つようなことをすることができます Execute SQL Task
. 。その後、そこにフローを正しいデータフローに向けることができます。次の画像は、条件付きフローの例を示しています。
このチュートリアルでは、異なる目標を持っていますが、著者は条件付きフローを作成する方法について説明しています。 http://www.simple-talk.com/sql/ssis/xml-configuration-files-in-server-integration-services/
ここでは、変数に関する詳細情報をご覧ください。 http://sqlfool.com/2009/08/getting-started-with-variables-in-ssis/
残念ながら、SSISでは、データフローパイプラインのメタデータを設計時に設定する必要があるため、データフロータスクを使用する場合は、レポートごとに個別のタスクが必要になります。
データフローを使用しないことにより、各レポートの個別のデータフロータスクとファイル接続マネージャーを必要とすることができます。代わりに、メタデータを事前に定義する必要なく、BCP(バルクコピープログラム)を使用してファイルにデータをコピーできます。 BCPは、ストアドプロシージャの結果セットを取得し、ファイルにダンプするだけです。 ダスティン・ライアンは、Bidnでこれを行う方法に関する素晴らしい記事を持っています。 SSIでBCPを使用することが、変換が不要な場合、データフロータスクよりも優れた選択である可能性があり、これがその時の1つです。