使用单值参数和多值参数

参数可以是单值参数,也可以是多值参数。多值参数可以设置为多个值。为多值参数定义可用的值列表时,Reporting Services 会自动在报表工具栏下拉列表中提供“全选”选项。可以使用该选项选择和清除列表中的所有值。

在设计图面上的文本框中,单值参数和多值参数都显示为以符号 @ 开头的简单表达式。例如,名为 Store 的参数显示为 [@Store]。有关详细信息,请参阅了解简单表达式和复杂表达式 (Reporting Services)

若要为参数设置多值属性,请在**“报表参数属性”对话框上选择“允许多个值”**选项。可以将任何类型的参数设置为多值(Boolean 之外)。

多值参数主要用于支持查询限制子句(例如,Transact-SQL WHERE 子句或 MDX Filter 子句)测试该参数包含在一组值中而不是等于单个值。有关如何创建和使用多值参数的详细信息,请参阅教程:向报表添加参数创建报表参数和设置报表参数属性

安全说明安全说明

在任何包括 String 类型参数的报表中,请务必使用可用值列表(也称为有效值列表),并确保任何运行该报表的用户仅具有查看该报表中数据所需的权限。定义 String 类型的参数时,系统将向用户显示一个可以使用任何值的文本框。可用值列表限制可以输入的值。如果报表参数与查询参数关联,但您没有使用可用值列表,则报表用户可能会在文本框中键入 SQL 语法,从而导致报表和服务器容易受到 SQL 注入攻击。如果用户有足够的权限执行新的 SQL 语句,则可能在服务器上产生意外结果。

如果报表参数与查询参数无关联,并且参数值包含在报表中,则报表用户可能会在参数值中键入表达式语法或 URL,并将报表呈现为 Excel 或 HTML 格式。如果其他用户查看报表并单击呈现的参数内容,则用户可能会无意中执行恶意脚本或链接。

若要降低无意中运行恶意脚本的风险,请仅从可信来源打开呈现的报表。有关如何保护报表的详细信息,请参阅保护报表和资源

为多值报表参数编写查询

您可为创建的任何报表参数定义多值参数。不过,如果希望使用查询将多个参数值传回数据源,则必须满足下列要求:

  • 数据源必须是 SQL Server、Oracle、Analysis Services、SAP BI NetWeaver 或 Hyperion Essbase。

  • 数据源不能是存储过程。Reporting Services 不支持将多值参数数组传递给存储过程。

  • 查询必须使用 IN 子句来指定参数。

下面的示例演示了在 Transact-SQL 语句的 WHERE 子句中 IN 关键字的用法。有关 IN 关键字或此查询返回的结果的详细信息,请参阅 IN (Transact-SQL)

SELECT FirstName, LastName, e.Title
FROM HumanResources.Employee AS e
    JOIN Person.Contact AS c 
    ON e.ContactID = c.ContactID
WHERE e.Title IN (@Title)

若要在报表中试用该方法,则要通过查询定义数据集。使用以下方法更改自动创建的报表参数 Title 的属性:

  • 选择**“多值”**选项。

  • 在**“可用值”中,选择“无查询”选项。在“值”列(将“标签”**列留空)中输入以下列表:Design Engineer、Buyer 和 Marketing Assistant。

  • 在**“默认值”**中,输入 Buyer。

  • 运行预览。为 Title 选择各种值组合,并确保获得预期结果。

注意注意

对于不能将参数处理为数组的数据源,报表服务器将重写该数据源的查询。若要生成所需结果,必须重写查询。将参数定义为多值参数并且查询使用 IN 语句指定参数时,将触发查询重写。如果生成不包括 IN 语句的查询,请意识到您没有使用报表服务器提供的用于支持多值参数的逻辑。

数据集、数据区域和组的筛选表达式在相应的**“属性”对话框的“筛选器”**页上定义。如果已定义引用多值参数的筛选表达式,则必须在此筛选表达式中使用 IN 运算符。使用非 IN 运算符的筛选表达式会导致处理错误。有关详细信息,请参阅如何添加筛选器 (Reporting Services)

编写引用多值参数的表达式

在表达式中引用参数时,需要使用内置 Parameters 集合。在表达式中使用多值参数时,既需要了解如何处理单个值也需要了解如何处理整组值。下表提供了设置为允许多个值的参数属性的示例和说明。

示例

说明

Parameters!<ParameterName>.Value

该参数的一组变量数据值。

Parameters!<ParameterName>.Label

一组用作该参数标签的字符串。

Parameters!<ParameterName>.IsMultiValue

表明是否已选择参数“允许多个值”选项的布尔属性。

Parameters!<ParameterName>.Count

数组中值的数量。

Parameters!<ParameterName>.Value(0)

多值数组中的第一个值。

Parameters!<ParameterName>.Label(0)

多值数组中的第一个标签。

Parameters!<ParameterName>.Value(Parameters! <ParameterName>.Count-1)

多值数组中的最后一个值。

Parameters!<ParameterName>.Label(Parameters! <ParameterName>.Count-1)

多值数组中的最后一个标签。

=Join(Parameters!<ParameterName>.Value,", ")

将 String 类型多值参数数组中的所有值连接为一个字符串的表达式。

=Split("Value1, Value2, Value3",",")

接收一个字符串并创建一组对象,这些对象可以被传递到需要多值参数的子报表和钻取报表。

可以使用 SPLIT 或 JOIN 函数拆分或组合任意表达式数组中的值。可以使用 STRING 或 CINT 函数将值转换为字符串或整数。

有关表达式中单值和多值参数的详细信息和示例,请参阅在表达式中使用 Parameters 集合引用 (Reporting Services)