2014年11月27日木曜日

SSISのスクリプトタスクからReporting Serviceのレポートをエクスポートする方法

SSISのスクリプトタスクからSSRSのレポートを出力する方法がtechnetにあった。

Bulk Report Generation using SSIS and SSRS 2008 R2
http://technet.microsoft.com/ja-jp/library/ff793463(v=sql.105).aspx

まずVisual Studioのコマンドプロンプトで、WSDLツールを利用して、web serviceで提供されるコードを c#形式のコードに変換する。
wsdl /out:C:/ReportService.cs http://[servername]/ReportServer/ReportExecution2005.asmx?wsdl
Web Serviceで提供されるコードを保存して利用する方法は個人では思いつかなかったのでありがたい。

以下SSIS実装の手順(一部改編)。
  1. SSISのプロジェクトを開き、スクリプトタスクを作成。
  2. スクリプトを編集。上で保存したcsファイルを既定として追加する。
  3. 参照の追加で、System.Web.Services を追加する。 
  4. technetのsampleコードに従ってスクリプトタスクに追記する。
この通りに実装したら見事SSISでレポートをエクスポートすることに成功した。

今困っているのは、読み取り専用(内部)のパラメータをもつレポートの出力に失敗すること。

A,B,Cと3つのパラメータがあり、Aだけが変更可能なパラメータで、B,CはAに依存する内部パラメータ。

内部パラメータなので、パラメータを渡したくない。だが渡していないはずの、B,Cのパラメータについてエラーとなる。

            //Create Continent Parameter and assign it's value
            ParameterValue[] paramval = new ParameterValue[3];
            paramval[0] = new ParameterValue();
            paramval[0].Name = "A";
            paramval[0].Value = "foo"

[Render Report Error] エラー : 既定値またはレポート パラメーター 'B' に指定された値は、有効な値ではありません。 ---> Microsoft.ReportingServices.Diagnostics.Utilities.InvalidReportParameterException: 既定値またはレポート パラメーター 'B' に指定された値は、有効な値ではありません。
   場所 System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall)
   場所 System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
   場所 ReportExecutionService.Render(String Format, String DeviceInfo, String& Extension, String& MimeType, String& Encoding, Warning[]& Warnings, String[]& StreamIds)
   場所 ST_2612c9ef033f4370afb152fd21285b38.ScriptMain.Main()




 B、Cのパラメータは読み取り専用で本来は渡さなくていい値。 やむを得ず、レポート側で書き込み可のパラメータに変更して値を渡すことに。これでは内部パラメータが使えない。


            //Create Continent Parameter and assign it's value
            ParameterValue[] paramval = new ParameterValue[3];
            paramval[0] = new ParameterValue();
            paramval[0].Name = "A";
            paramval[0].Value = "foo"
            paramval[1] = new ParameterValue();
            paramval[1].Name = "B";
            paramval[1].Value = "bar";
            paramval[2] = new ParameterValue();
            paramval[2].Name = "C";
            paramval[2].Value = "boo";         


追って調査する。