我有一个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行。
答案 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%'