【问题标题】:SSRS Reporting - Multiple Selections Defining Multiple QueriesSSRS 报告 - 定义多个查询的多项选择
【发布时间】:2023-03-16 00:52:01
【问题描述】:

一个 SSRS 数据集有两个 T-SQL 查询。只有当某个参数选择了两个或多个值时,才会运行一个查询。仅当参数仅选择一个值时,才会运行另一个查询。如何让数据集知道参数中选择了一个值还是多个值?

【问题讨论】:

  • 您可以创建一个额外的整数参数,将其设置为 hidden 并使用这样的表达式作为默认值:Parameter!YourMultipleValueParam.Value.Count 然后在数据集中您可以使用 hidden参数来确定在YourMultipleValueParam 参数中选择的值的数量。
  • 好的,我在主数据集中写什么来定义要使用的查询?像 IF (@YourMultipleValueParam > 1) 和 (@YourMultipleValueParam = 1) 这样的东西可以吗?
  • 我的意思是你有两个在 SSRS 中创建一个额外的隐藏参数,并使用它来将所选值的数量传递给数据集。所以如果你将隐藏参数命名为NumberOfValues,你应该在SQL中使用IF( @NumberOfValues > 1)
  • 好的,这很好用,它解决了我的问题,但我不能将您的回复标记为最佳答案,因为出于某种原因它不会让我这样做,但我只想说这种情况是现在关闭以避免任何未来不需要的答案
  • 我会添加一个答案,以便您可以积极地结束问题。

标签: sql-server visual-studio tsql reporting-services ssrs-2012


【解决方案1】:

您可以创建一个名为NumberOfValues 的附加整数参数,将其设置为hidden,并在默认值中使用如下表达式:

=Parameter!YourMultipleValueParam.Value.Count

然后在数据集中你可以使用NumberOfValues参数来确定YourMultipleValueParam参数中选择的值的数量。

IF @NumberOfValues > 1 BEGIN ....

【讨论】:

    【解决方案2】:

    好问题。这是我发现的一种方法。

    第 1 步:在数据集的属性中,转到“参数”标签。使用以下表达式添加参数,将 MyParameterName 替换为您的参数名称。

    =join(Parameters!MyParameterName.Value,",")
    

    第 2 步:如果您还没有拆分函数,请将拆分函数添加到您的 SQL Server 函数中。简单的谷歌搜索会引导你到这样的地方:Split function equivalent in T-SQL?

    第 3 步:选择 SSRS 报告中使用的参数数量。根据结果​​,做你想做的事:(我的分割函数简称为Split)

    IF (select count(*) from Devl.dbo.Split(@MyParameterName,',')) = 1
    BEGIN
      /* Do your second query here, when one parameter is selected */
    END
    IF (select count(*) from Devl.dbo.Split(@MyParameterName,',')) > 1 
    BEGIN
      /* Do your first query here, when more than one parameter is selected */
    END
    

    编辑:如果您不想(或不能)创建/使用拆分功能,则可替代第 2 步和第 3 步。

    第 2 步:在顶部的主查询中,包含以下内容(基本上是拆分函数的内联版本)

    declare @string varchar(max), @delimiter char(1)
    declare @temptable table (items varchar(max))
    
    set @string = @MyParameterName
    set @delimiter = ','
    declare @idx int, @slice varchar(max)
    select @idx = 1     
    if len(@String)<1 or @String is null  return     
    
    while @idx!= 0     
    begin     
        set @idx = charindex(@Delimiter,@String)     
        if @idx!=0     
            set @slice = left(@String,@idx - 1)     
        else     
            set @slice = @String     
    
        if(len(@slice)>0)
            insert into @temptable(Items) values(@slice)     
    
        set @String = right(@String,len(@String) - @idx)     
        if len(@String) = 0 break     
    end
    

    第 3 步:选择 SSRS 报告中使用的参数数量。根据结果​​,做你想做的事:(我的分割函数简称为Split)

    IF (select count(*) from @temptable) = 1
    BEGIN
      /* Do your second query here, when one parameter is selected */
    END
    IF (select count(*) from @temptable) > 1 
    BEGIN
      /* Do your first query here, when more than one parameter is selected */
    END
    

    【讨论】:

    • 我什么都懂,除了拆分功能。我在哪里写函数?我是将其添加到主数据集(具有两个查询的那个)、参数的数据集中,还是将其放入新数据集中?
    • 两者都不是,它是一个要添加到数据库的函数 (msdn.microsoft.com/en-us/library/ms186755.aspx)(想想 SSMS,而不是通过报告服务)。一旦它在数据库中,您就可以在查询中使用它。如果您无权将其添加到数据库中,我将修改第 2 步以包含一个内联解决方案,您只需将其添加到查询顶部即可。
    • 虽然 Matt H 的解决方案没有任何问题,但我会选择 Alejandro 的解决方案,因为它使用 SSRS 函数来确定所选参数值的数量。按照 Alejandro 的建议添加参数后,您可以在数据集中简单地编辑数据集以读取 IF @MyNewParameter >1 BEGIN ....your multi value query... END ELSE。 BEGIN 你的单值查询 END。 (抱歉缺少换行符)
    • 我同意@Canadean_AS。我没有看到亚历杭德罗对你的问题的评论。我发布的方法是为了以独特的方式实际利用查询中选择的所有参数,而不是简单地计算它们。 Alejandro's 是您问题的更好解决方案。
    • 抱歉,我无法编辑数据库或添加新表,因为我对数据库只有只读访问权限。我没有在我的问题中包含实际参数名称和查询是有原因的,因为所有这些都必须保留在公司内部。所以,是的,亚历杭德罗的解决方案非常完美,因为它做得很好,但我不能将他的评论标记为最佳答案,所以到目前为止这个案例已经基本结束。
    猜你喜欢
    • 1970-01-01
    • 2018-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多