【问题标题】:SSRS 2008: Why does a declared query variable show in the "Define Query Parameters" window?SSRS 2008:为什么声明的查询变量会显示在“定义查询参数”窗口中?
【发布时间】:2012-10-14 05:54:47
【问题描述】:

我在 Reporting Services 2008 中创建数据集时遇到问题。这是我要使用的查询(通用化以供公众使用):

Declare @PersonID as int
set @PersonID = (select top 1 personID from People where name = @PersonName)

select (some columns)
from [otherTable]
where personID = @PersonID

我只有一个输入参数:@PersonName。然而,Studio 2008 似乎认为@PersonID 需要在“定义查询参数”窗口中的值。所以当我尝试只为@PersonName 输入一个值时,它会给我“这个变量已经被定义”。

我传递@PersonName 是因为我需要显示一个人类可读的人员列表,以便从下拉列表中选择,作为报告的唯一面向用户的参数。我意识到我可以做一个子查询并忘记上面示例中的变量,但是我的实际查询更大/更丑,而且我不能准确地将索引添加到数据表中,所以我想限制表扫描。

【问题讨论】:

    标签: tsql ssrs-2008 bids


    【解决方案1】:

    您可以创建一个新数据集以与您的参数一起使用。

    首先,一个带有查询的新数据集

    SELECT PersonID, PersonName FROM People
    

    然后,在您的报告参数上(为了清楚起见,我将名称更改为 Person),在“可用值”部分中,将其切换为“从查询中获取值”。选择新数据集,将 Value 字段设置为 PersonID,将 Label 字段设置为 PersonName。

    最后,将主数据集的 @PersonID 参数设置为报表参数 [@Person]。

    这样,您可以显示列表,但仍然可以使用 ID。不需要 PersonName 报告参数。

    【讨论】:

      【解决方案2】:
      Declare @PersonName char(20) 
      
      select (some columns)
      from  [otherTable] 
      join  [People]
        on  [otherTable].[personID] = [People].[personID]
      where [People].[name] = @PersonName 
      

      在您认为它会出现性能问题之前先试一试。

      【讨论】:

        【解决方案3】:

        为什么不把查询变成一个存储过程呢?根据我的经验,存储过程提供了更好的性能(但要注意参数嗅探)以及可重用性。

        编辑:

        它会彻底解决你的问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-01-18
          • 2012-09-25
          • 1970-01-01
          • 2011-04-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多