SSRS参数嗅探具有多个值

时间:2015-01-20 15:20:48

标签: sql sql-server reporting-services ssrs-2008 parameter-sniffing

我有一个sql查询,在ssms中运行大约需要15秒,但是当我在ssrs中运行它时,需要5-7分钟。从我读过的所有内容看来,这似乎是来自“参数嗅探”,所以我在查询中声明了变量来绕过这个,但是我仍然遇到了多个参数的问题。

我试过这个:https://social.msdn.microsoft.com/Forums/sqlserver/en-US/ee0e8b0c-44ae-4558-9b7e-d287dacfb8a5/multi-value-parameter-sniffing?forum=sqlreportingservices

使用:

我传入的参数是:@Places

create table #places (place varchar(50))
insert into #places select Val from dbo.parseValues(@Places,',')

select * from mytable m
inner join #places p on p.place = m.place
drop table #places

如果我在运行报表时只选择一个位置,则可以正常工作,否则会抛出错误消息:

  

有关此错误的详细信息,请导航到报表服务器   本地服务器计算机,或启用远程错误   ----------------------------数据集'dataset1'的查询执行失败。 (rsErrorExecutingCommand)   ----------------------------报告处理期间发生错误。 (rsProcessingAborted)

ParseValues函数来自http://visakhm.blogspot.in/2010/02/parsing-delimited-string.html

有没有人有其他想法?

1 个答案:

答案 0 :(得分:0)

正如我在评论中所补充的那样,'SSRS 2008`不会隐含地将多个值转换为字符串。因此,在将其传递给解析函数(接受逗号分隔的字符串)之前,需要将其转换为逗号分隔的字符串。很重要的是,这很容易。

在报告中创建隐藏参数(例如@StringPlaces)。在“可用值”部分中,输入以下表达式:

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

Join函数准备以逗号分隔的字符串。现在您需要做的就是将这个新准备的参数传递给解析函数,该函数将其拆分为行。

parseValues(@StringPlaces,',')

让解析函数返回一个表,这样就不再需要临时表了。

注意从SQL Server 2012开始,您不需要将值集转换为字符串。引擎为你做到了。因此,如果您的代码在SQL 2012/2014上运行,那么它就像魅力一样。