概念的には、ソリューションはどのように見えるかというと、ソースクエリを実行して結果セットを生成します。それを変数に格納してから、それらの結果を反復処理する必要があります。各行について、その行の値を使用してストアドプロシージャを呼び出し、結果を新しい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に変更します。式で、
"C:\\ssisdata\\ShredRecordset." + @[User::ParameterValue] + ".xlsx"
(またはファイルとパスが何であれ)。これは、ParameterValueの値が変化すると変化するように変数を構成します。これにより、一意のファイル名を確実に取得できます。必要に応じて命名規則を変更できます。\
をエスケープする必要があることに注意してください 式の中にいるときはいつでも。
接続マネージャー
OLEDB接続マネージャーを使用していると仮定しました。鉱山の名前はFOOです。 ADO.NETを使用している場合、概念は似ていますが、パラメーターなどに関連するニュアンスがあります。
また、Excelを処理するために2番目の接続マネージャーが必要になります。 SSISがデータ型について気まぐれである場合、Excelは、データ型について眠っている間、フォークで背中を突き刺します。待って、データフローに実際にこの接続マネージャーを作成させて、タイプが適切であることを確認します。
ソースクエリから結果セットへ
SQL Load Recordset
SQL実行タスクのインスタンスです。ここに、ソースを模倣するための簡単なクエリがあります。
SELECT 'aq' AS parameterValue
UNION ALL SELECT 'dr'
UNION ALL SELECT 'tb'
[全般]タブで重要なのは、ResultSetをNone
から切り替えたことです。 Full result set
へ 。これを行うと、[結果セット]タブがグレー表示から使用可能になります。
上記で作成した変数(User ::RecordSet)に変数名を割り当てたことを確認できます。結果名は0
です 。これは、デフォルト値NewResultName
として重要です。 動作しません。
FELCシュレッドレコードセット
Foreachループコンテナを取得します。これを使用して、前の手順で生成された結果を「細断処理」します。
列挙子をForeach ADO Enumerator
として構成します User::RecordSet
を使用する ADOオブジェクトのソース変数として。 rows in the first table
を選択します 列挙モードとして
[変数マッピング]タブで、変数User::ParameterValue
を選択する必要があります インデックス0を割り当てます。これにより、レコードセットオブジェクトの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パッケージを使用してストアドプロシージャの実行を自動化する方法にありますか?