0

我有一个 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

有人有其他想法吗?

4

1 回答 1

0

正如我在评论中添加的那样,“SSRS 2008”不会将多个值隐式转换为字符串。因此,在将其传递给解析函数(接受逗号分隔的字符串)之前,您需要将其转换为逗号分隔的字符串。好的部分是,这很容易。

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

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

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

parseValues(@StringPlaces,',')

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

注意从 SQL Server 2012 开始,您不需要将值集转换为字符串。引擎会为你做这件事。因此,如果您的代码在 SQL 2012/2014 上运行,它会像一个魅力一样工作。

于 2015-01-21T10:38:33.387 回答