为什么SQL Server数据库功能执行缓慢|具有存储过程的SSRS多值参数

问题描述 投票:0回答:2

我在使用SQL Server时正在寻找一些有趣的问题的见解。

背景

  • 我们在APS(SQL Server PDW / MPP)上运行的SSRS报告很少
  • 具有嵌入式查询的报表数据集直接在数据库上运行。现在,已将更大的表格之一拆分为“当前”和“历史”表(“当前”表具有最近几年的数据),显然可以提高这些报告的性能。
  • 我需要以某种方式更改SSRS报告,以使相同的报告现在应基于选择了哪个“年份”作为参数之一而重定向到这些表中的任何一个。
  • 我的设计方法:我决定在SSRS报告数据集中使用数据库存储过程(SP),在存储过程中构建所需的逻辑。

问题陈述

  • 顺便说一句,多值参数将无法按照我假设的方式工作。

  • 当我查看此内容时,这似乎是一个已知问题,并且是SSRS支持不力的功能之一。似乎多值参数中的多个值仅被视为单个值,即使在打印时它们看起来像多个值,如

    val1,val2,val3

  • 以下是我提到的几篇文章:Link1 Link2

  • [[然后,我决定根据上,下篇文章中的一些建议,找到一些解决方法,以使其正常工作。

Link3

  • 经过多次尝试,我设法通过构建如下所示的逻辑来使其正常工作

    • 步骤1:从SSRS,参数更改为:

      =Join(Parameters!param_1.Value,"|")

  • Step2:在SP中使用一段代码来转换/格式化多值参数并将其存储在新变量(SQLString)中

    --Relevant code: -- Block of conversion code -- to convert/format the multivalued param and store it in a new variable -- after this the SQLSTRING variable's final value is set as -- |val1|val2|val3| -- Relevant where clause AND (@SQLString LIKE '%|' + tbl.attr_1 + '|%')

  • 这有效!尽管,警告指出这肯定不是有效的。在SSRS报告中,结果很快(尽管这只是一个示例查询)。
  • 现在,我决定将“转换代码块”转换为标量函数,请参阅下面的内容,以便我可以每次为每个多值参数调用此函数。 Link 4
  • 这也有效,但是速度太慢(对于只有一个多值参数的同一示例查询,即对该函数的一次调用。
  • 问题

      [为什么我将一段代码转换为函数会降低查询执行的速度,这让我感到困惑(我对SQL Server的内部知识并不了解)。
  • 将不胜感激任何指针。

    提前感谢。

  • sql-server reporting-services ssrs-2016
    2个回答
    0
    投票
    我总是将连接的参数操纵到存储过程的表中,然后内部联接到该表。

    使用我自己的数据进行采样:

    我使用的SSRS加入:

    =Join(Parameters!param_1.Value,"#~--~#")

    然后是存储过程:

    create proc whatever @profs varchar(8000) as declare @profs_t table (ProfName varchar(70)) declare @delim varchar(10) = '#~--~#' declare @delimlen int = len(@delim) declare @idx int = 1 - @delimlen while charindex(@delim, @profs, @idx + @delimlen) <> 0 begin insert into @profs_t select substring(@profs, @idx + @delimlen, charindex(@delim, @profs, @idx + @delimlen) - @idx - @delimlen) set @idx = charindex(@delim, @profs, @idx + @delimlen) end insert into @profs_t select substring(@profs, @idx + @delimlen , len(@profs)) select * from @profs_t pt inner join professionals p on p.profname = pt.profname

    这会将连接参数从SSRS转换为表变量(您可以很容易地使用临时表)。这是相当通用的,可以使用任何定界符,甚至可以使用多个字符定界符(如图所示)。我想定界符也可以作为参数传递给proc。

    0
    投票
    我认为我找到了问题的答案,如下页所述。Scaler UDF
    © www.soinside.com 2019 - 2024. All rights reserved.