2012-04-02 71 views
4

我有一个参数@Department和数据集其值设置为=Join(Parameters!Department.Value,",")。我将它设置为接受多个值,并在我的SQL中,我有以下子句:(RTRIM(G.DeptName) IN (@Department))多值参数不工作

它的工作原理,只要用户选择一个部门,但每次都被选中多个部门不起作用。它运行,但不显示任何数据。例如,如果我选择“会计”,它会显示“会计”信息。但如果我选择“会计”和“营销”,则什么都不会显示出来。

为什么这是行不通的任何想法?另外,是否有可能以这种方式使用“字符串”值以外的其他方式来执行此操作?

+0

你能发布您的查询吗? – Teja 2012-04-02 15:55:44

+0

为什么在数据集中使用Join? SSRS中的多值参数应该“正常工作”:http://msdn.microsoft.com/en-us/library/aa337292(v=sql.100).aspx – 2012-04-02 17:05:07

回答

3

您正在做出错误的假设。

IN ('1,2,3,4')IN (1,2,3,4)IN ('1', '2', '3', '4')

截然不同目前你正在做什么它的第一个。您正在检查你的部门名称是否在列表里面只有一个值长; @department字符串。该值中包含逗号,但它仍然是单个字符串,因此它仍然是列表中的单个项目。

您有两种选择。

动态地构建了SQL,使您的列表是SQL的一部分,而不是一个字符串参数。

或查找上线提供的许多功能SPLIT()之一。这是我推荐的。然后,您可以这样做......

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

甚至更​​好,加入对SPLIT()函数的结果...

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

只需额外注意:如果您有'G .DeptName',将其封装在诸如'RTRIM()'之类的函数中将意味着您不能使用该索引来查找相关记录。相反,你会得到一个扫描,使索引旁边毫无意义。如果可能的话,存储预先修剪过的值,这样你就不需要'RTRIM()',这意味着你可以使用你的索引,并缩短你的代码:) – MatBailie 2012-04-02 16:41:23