SSRSレポートで複数値の文字を渡す方法は?


8

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,","),",")

これらはすべて単一値で機能しますが、複数値では機能しません。

ここで何が欠けていますか?

回答:


7

解決策を見つけました。ストアドプロシージャの値を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()...


これが他の人を助ける場合:結合式(=join(Parameters!<your param name>.Value,","))をパラメーターを読み取るデータセットの[パラメーター]タブの下に追加できます:[パラメーター値]ドロップの右側に、式を追加するための[fx]ボタンがあります-ダウン。
Doug_Ivison 2017

また、解析するUDFを作成する代わりに、データベース値とパラメーター値が確実に一意であり、互いのサブセットでない場合は、解析をスキップしてCHARINDEXのみを使用します。たとえば、埋め込みSQLでパラメーターを読み取るコードが: WHERE <Table>.[<Column>] IN (@MultiValueParm)、ストアドプロシージャのコードは次のようになりますWHERE CHARINDEX(<Table>.[<Column>], @MultiValueParmAsText) > 0
Doug_Ivison

すばらしいQ&A、ありがとう!ちなみにSQLFool.comはダウンしているようです。ParseString()関数は、github.com
scripts
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.