如何使用多值参数过滤SSRS报告就像string.contains一样

时间:2016-02-05 20:09:40

标签: ssrs-2008-r2

我有一个SSRS报告调用存储过程来获取结果集。其中一列是“所有者”列,可以有0个或更多人名,字符串与“&”连接。我无法更改存储过程,因此在报表中我需要添加一个多值报表参数。此参数在下拉列表中显示所有可能的所有者名称,并且需要使用此参数在结果集从存储过程调用返回后执行后过滤。我的问题是如何在Owner字段上创建这个过滤器,其作用类似于string.contains?为了更好地说明,下面是一个例子:

以下是原始结果集

Ticket Number Owner
100           John Doe & Jane Doe
101           John Doe & Jack Smith
102           John Doe & Bill White

如果用户在Owner参数下拉列表中选择Jack Smith和Bill White,则结果应为

Ticket Number Owner
101           John Doe & Jack Smith
102           John Doe & Bill White

如果仅选择了John Doe,则应返回所有3行。

2 个答案:

答案 0 :(得分:0)

你可以这样做。

 DECLARE @String NVARCHAR(10)
 SET @String = 'string'

 WHERE Owner LIKE '''' + '%' + @String + '%' + '''' 

应该给你

WHERE Owner LIKE '%string%'

答案 1 :(得分:0)

假设您的多值参数填充了各个所有者'名称,实现这一目标有两个步骤。

添加嵌入到报表中的DataSet,并将查询类型更改为&#39; text&#39;,输入以下SQL并相应地替换<StoredProcedureName>

-- Insert stored procedure results into temp table
CREATE TABLE #Temp(TicketNumber int, Owner nvarchar(50))
INSERT INTO #Temp 
EXEC <StoredProcedureName>

-- Build dynamic SQL query to allow for single or multiple values from the parameter
DECLARE @SQL NVARCHAR(1024) = 'SELECT * FROM #Temp WHERE Owner LIKE ' + '''%' + REPLACE(@S,',','%'' OR Owner LIKE ''%') + '%'''

EXEC(@SQL)

DROP TABLE #Temp

在嵌入式DataSet的“属性”窗口中,打开“参数”选项卡,打开@S参数的表达式编辑器,然后添加以下VBA:

=Join(Parameters!ReportParameter1.Value, ",")

这很重要,因为它在选择多个参数值时构建单个字符串。例如,我选择Jane Doe和Bill White,输出字符串将是:&#34; Jane Doe,Bill White&#34;。

动态SQL语句用'% OR LIKE %'替换任何逗号(,)出现构建动态SQL字符串,该字符串在执行时相当于:

SELECT * FROM #Temp WHERE Owner LIKE '%Jane Doe%' OR LIKE '%Bill White%'