概念的には、ソリューションはどのように見えるかというと、ソースクエリを実行して結果セットを生成します。それを変数に格納してから、それらの結果を反復処理する必要があります。各行について、その行の値を使用してストアドプロシージャを呼び出し、結果を新しいExcelファイルに送信する必要があります。
私はあなたのパッケージがこのように見えることを想像します
「FELCShredRecordset」という名前のForeachループコンテナにアタッチされた「SQLLoadRecordset」という名前のSQL実行タスク。その中にネストされているのは、「DFTGenerateOutput」という名前のデータフロータスクの優先順位である「FSTCopyTemplate」という名前のファイルシステムタスクです。
設定
初心者の方なので、詳しく説明していきます。手間を省くために、 BIDSHelperのコピーを入手してください。これは、BIDS/SSDTの設計エクスペリエンスを向上させる無料のオープンソースツールです。
変数
制御フローの背景をクリックします。何も選択せずに、右クリックして[変数]を選択します。ポップアップ表示される新しいウィンドウで、新しい変数を作成するボタンを4回クリックします。何もクリックしない理由は、SQL Server 2012まで、変数作成のデフォルトの動作は、現在のオブジェクトのスコープで変数を作成することであるためです。これにより、新しい開発者と経験豊富な開発者の両方にとって、多くの髪の毛が失われました。変数名では大文字と小文字が区別されるため、これにも注意してください。
- 変数の名前をRecordSetに変更します。データ型をInt32からObjectに変更します
- Variable1の名前をParameterValueに変更します。データ型をInt32からStringに変更します
- Variable2の名前をTemplateFileに変更します。データ型をInt32からStringに変更します。値を出力Excelファイルのパスに設定します。C:\ ssisdata\ShredRecordset.xlsxを使用しました
- 変数4の名前をOutputFileNameに変更します。データ型をInt32からStringに変更します。ここでは、少し高度なことを行います。変数をクリックし、F4キーを押して[プロパティ]ウィンドウを表示します。EvaluateAsExpressionの値をTrueに変更します。Expressionで、
"C:\\ssisdata\\ShredRecordset." + @[User::ParameterValue] + ".xlsx"
(またはファイルとパスが何であれ)に設定します。これは、ParameterValueの値が変更されると変更するように変数を構成します。これにより、一意のファイル名を確実に取得できます。必要に応じて命名規則を変更できます。\
式にいるときはいつでもエスケープする必要があることに注意してください。
接続マネージャー
OLEDB接続マネージャーを使用していると仮定しました。鉱山の名前はFOOです。ADO.NETを使用している場合、概念は似ていますが、パラメーターなどに関連するニュアンスがあります。
また、Excelを処理するために2番目の接続マネージャーが必要になります。SSISがデータ型について気質的である場合、Excelは、データ型について眠っている間、精神病を患っています。待機して、データフローに実際にこの接続マネージャーを作成させて、タイプが適切であることを確認します。
結果セットへのソースクエリ
これは、 SQL実行タスクSQL Load Recordset
のインスタンスです。ここに、ソースを模倣するための簡単なクエリがあります。
SELECT 'aq' AS parameterValue
UNION ALL SELECT 'dr'
UNION ALL SELECT 'tb'
[全般]タブで重要なのは、ResultSetをからNone
に切り替えたことFull result set
です。これを行うと、[結果セット]タブがグレー表示から使用可能になります。
上で作成した変数(User :: RecordSet)に変数名を割り当てたことがわかります。結果の名前は0
です。これはデフォルト値として重要ですが、NewResultName
機能しません。
FELCシュレッドレコードセット
Foreachループコンテナを取得します。これを使用して、前の手順で生成された結果を「細断処理」します。
列挙子をADOオブジェクトのソース変数としてForeach ADO Enumerator
使用するように構成します。列挙モードとしてUser::RecordSet
選択しますrows in the first table
[変数マッピング]タブで、変数を選択し、それにインデックス0を割り当てる必要があります。User::ParameterValue
これにより、レコードセットオブジェクトの0番目の要素が変数ParameterValueに割り当てられます。SSISはここでは暗黙的な変換を行わないため、データ型の合意があることが重要です。
FSTコピーテンプレート
これはファイルシステムタスクです。テンプレートのExcelファイルをコピーして、適切な名前の出力ファイル(パラメーター名が含まれている)を作成します。次のように構成します
- IsDestinationPathVariable:True
- DestinationVarible:User :: OutputFileName
- OverwriteDestination:True
- 操作:ファイルをコピーする
- IsSourcePathVariable:True
- SourceVariable:User :: TemplateFile
DFT生成出力
これはデータフロータスクです。結果をファイルに直接ダンプしていると仮定しているので、OLEDBソースとExcel宛先が必要です。
OLEDB dbo_storedProcedure1
これは、制御フローで細断処理したパラメーターを使用して、ソースシステムからデータを取得する場所です。ここにクエリを記述し、を使用し?
てパラメータがあることを示します。
データアクセスモードを「SQLコマンド」に変更し、使用可能なSQLコマンドテキストにクエリを入力します
EXECUTE dbo.storedProcedure1 ?
[パラメータ...]ボタンをクリックして、図のように入力します
- パラメータ:@parameterValue
- 変数:User :: ParameterValue
- パラメータ方向:入力
Excelの宛先をOLEDBソースに接続します。ダブルクリックし、[Excel接続マネージャー]セクションで[新規...]をクリックします。2003または2007形式(.xlsと.xlsx)のどちらが必要か、ファイルにヘッダー行を含めるかどうかを決定します。ファイルパスについては、@ User :: TemplatePath変数に使用したのと同じ値を入力し、[OK]をクリックします。
次に、Excelシートの名前を入力する必要があります。その[新規...]ボタンをクリックすると、データ型のマッピングに関する十分な情報がないことが表示される場合があります。心配しないでください、それは準標準です。次に、次のようなテーブル定義がポップアップ表示されます
CREATE TABLE `Excel Destination` (
`name` NVARCHAR(35),
`number` INT,
`type` NVARCHAR(3),
`low` INT,
`high` INT,
`status` INT
)
「テーブル」名は、ワークシート名、正確にはワークシート内の名前付きデータセットになります。Sheet1を作成し、[OK]をクリックしました。シートが存在するので、ドロップダウンでシートを選択します。Sheet1$をターゲットシート名として使用しました。それが違いを生むかどうかはわかりません。
[マッピング]タブをクリックすると、正常に自動マッピングされるはずなので、[OK]をクリックします。
ついに
この時点で、パッケージを実行すると、毎回テンプレートファイルが上書きされます。秘密はExcel Connection Manager
、ハードコードされた名前を持つ必要がないことを作成したことを伝える必要があるということです。
[接続マネージャー]タブでExcel接続マネージャーを1回クリックします。[プロパティ]ウィンドウで、Expressions
セクションを見つけて省略記号をクリックします。...
ここで、プロパティを構成し、ExcelFilePath
使用する式は次のとおりです
。@[User::OutputFileName]
あなたのアイコンなどが異なって見えるなら、それは予想されることです。これは、SSIS2012を使用して文書化されました。ワークフローは2005年と2008/2008R2で同じになりますが、スキンが異なります。
このパッケージを実行しても起動せず、ACE12またはJet4.0で利用できないエラーが発生した場合は、64ビットマシンを使用しており、32ビットで実行することをBIDS/SSDTに通知する必要があります。モード。
Run64BitRuntime値が。であることを確認しますFalse
。このプロジェクト設定は、プロジェクトを右クリックして[構成プロパティ]を展開すると表示され、[デバッグ]の下のオプションになります。
参考文献
レコードセットオブジェクトを細断処理する別の例は、SSISパッケージを使用してストアドプロシージャの実行を自動化する方法にあります。