1つのデータソースから供給される3つのデータセットを含むSSRSレポートがあります。メインデータセットは、他の2つのデータセットを利用した一連のパラメーターに基づいて一部のデータを集約するストアドプロシージャです。
このレポートを強化するメインのストアドプロシージャには、4つのパラメーターがあります。 1つはデータの種類のID、2つは開始日と終了日のID、3つ目はフラグパラメータです。フラグパラメーターは、VARCHAR値でもある複数のフラグ値を渡したい複数値パラメーターです。
@Flagパラメータのストアドプロシージャには、次の共通点があります。
WHERE [Flag] IN (@Flag)
次に、もちろん、SSRSレポートの@Flagパラメーターを設定して、ディメンションテーブルからそれらの@Flag値をプルしているクエリからも入力される「複数の値」を許可します。
私の問題
INT値を処理する場合、ほとんどの場合、同じ手法を使用すると機能します。ただし、文字値を処理していると失敗します。 1つのフラグを選択すると、レポートは魔法のように機能します。複数のフラグを選択すると、フラグがストアドプロシージャに正しく渡されず、結果が返されません。
ストアドプロシージャで複数値フラグを直接テストする場合:
WHERE [Flag] IN ('A', 'B', 'C')
ストアドプロシージャは正しく動作します。したがって、問題はストアドプロシージャではなく、SSRSが複数値の値を@Flagパラメータに渡す方法です。
試したソリューション
この@FlagパラメータのSSRSデータセットに次の調整を試みました。
=join(Parameters!<your param name>.Value,",")
そしてこれも:
=SPLIT(JOIN(Parameters!<your param name>.Value,","),",")
これらはすべて単一値で機能しますが、複数値では機能しません。
ここで何が欠けていますか?
解決策を見つけました。ストアドプロシージャの値をUDFで適切に分割しませんでした。
このストアドプロシージャで複数の値を正しく渡すには、使用しているデータセットパラメータに次のコードを追加する必要があります。
_=join(Parameters!<your param name>.Value,",")
_
これは基本的に複数の値を配列に結合し、それを_@Flag
_パラメーターを介して渡します。次のステップでは、SQLをストアドプロシージャに追加して、値を正しく受け取ってダイジェストし、IN
句で値を読み取ります。
GoogleはUDF文字列パーサーをオンラインで検索します。から選択する多くがあります。ミシェル・アフォードの_dba_parseString_udf
_を使用しました http://sqlfool.com 。
UDFをインストールしたら、IN
句を変更して、SSRSから次のように渡される新しい多値パラメーターを受け取ることができます。
_WHERE [Flag] IN (SELECT * FROM dba_parseString_udf(@Flag, ','))
_
したがって、SSRSは次の値を渡します。
_@Flag = 'A,B,C'
_
次に、私のUDFはその文字列を次のように正しく解析します。
_A
B
C
_
そして、_@Flag
_パラメータにSELECT * FROM UDF()...
を正しく入力します