2012-04-02 15 views
4

パラメータ@Departmentがあり、データセットの値を=Join(Parameters!Department.Value,",")に設定しました。私はそれを複数の値を受け入れるように設定し、私のSQLには次の句があります:(RTRIM(G.DeptName) IN (@Department))SSRS 2008の複数値パラメータが機能しない

ユーザーが1つの部門を選択した場合は常に動作しますが、複数の部門が選択されている場合は常に機能しません。実行されますが、データは表示されません。たとえば、[会計]を選択すると、[会計]情報が表示されます。しかし、「会計」と「マーケティング」を選択すると、何も表示されません。

これはなぜ機能しないのでしょうか?また、これを "string"値以外のものでこのようにすることは可能ですか?

+0

クエリを投稿できますか? – Teja

+0

なぜデータセットで結合を使用していますか? SSRSの多値パラメータは「うまく動作する」必要があります。http://msdn.microsoft.com/en-us/library/aa337292(v=sql.100).aspx –

答えて

3

あなたは誤った仮定をしています。あなたが現在それを最初のものをやっている

IN ('1,2,3,4')IN (1,2,3,4)またはIN ('1', '2', '3', '4')

とは非常に異なっています。あなたの部門名がリスト内にあるかどうかを確認しています。値が長すぎます。 @department文字列。その値はカンマで区切られていますが、それはまだ1つの文字列なので、リスト内の項目は1つです。

2つのオプションがあります。

あなたのリストが文字列パラメータではなくSQLの一部であるように動的にSQLを構築します。

または多くのSPLIT()機能の1つをオンラインで参照できます。これは私が推奨するものです。その後、同様に民主党員はあなたがそのための参加機能を必要と

yourTable AS G 
INNER JOIN 
    dbo.split(@department) AS department 
    ON RTRIM(G.DeptName) = department.item 
+2

ちょっとした注意:G .DeptName'を 'RTRIM()'のような関数にラップすると、そのインデックスを使って関連レコードを検索することはできません。代わりに、インデックスを無意味にするスキャンを取得します。可能であれば、あなたのクエリに 'RTRIM()'を必要としないように、あらかじめトリミングされた値を格納します。つまり、インデックスを使用してコードを短縮することができます。 – MatBailie

0

...、でも

WHERE 
    RTRIM(G.DeptName) IN (SELECT * FROM dbo.split(@Department)) 

それとも、より良い...のような何かをSPLIT()機能の結果に参加することができます。

はあなたのクエリ

WHERE 
    RTRIM(G.DeptName) IN (SELECT * FROM dbo.split(@Department)) 

代わりの(RTRIM(G.DeptName) IN (@Department))

が動作するはずでhttp://blog.logiclabz.com/sql-server/split-function-in-sql-server-to-break-comma-separated-strings-into-table.aspx

残りすべてが大丈夫ですここから1つを使用することができます。