使用单值和多值参数

更新日期: 2006 年 12 月 12 日

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

Aa337292.note(zh-cn,SQL.90).gif注意:
在 SQL Server 2005 Service Pack 1 中禁用了“全选”选项,但在 SQL Server 2005 Service Pack 2 中已恢复此选项。

若要为参数设置多值属性,则在**“报表参数”对话框上选择“多值”**选项。可以将任何参数类型设置为多值(除布尔值之外)。

多值参数主要用于支持查询限制子句(例如,Transact-SQL WHERE 子句或 MDX 筛选子句),测试是否将它纳入一组值中,而不是测试它是否等于单个值。有关创建多值参数的详细信息,请参阅教程:将参数添加至基本表格报表创建报表参数和设置报表参数属性

Aa337292.security(zh-cn,SQL.90).gif安全说明:
在任何包括 String 类型参数的报表中,请务必使用可用值列表(也称为有效值列表),并确保任何运行该报表的用户仅具有查看该报表中数据所需的权限。定义 String 类型的参数时,系统将向用户显示一个可以使用任何值的文本框。可用值列表限制可以输入的值。如果报表参数与查询参数关联,但您没有使用可用值列表,则报表用户可能会在文本框中键入 SQL 语法,从而导致报表和服务器容易受到 SQL 注入攻击。如果用户有足够的权限执行新的 SQL 语句,则可能在服务器上产生意外结果。 如果报表参数与查询参数无关联,并且参数值包含在报表中,则报表用户可能会在参数值中键入表达式语法或 URL,并将报表呈现为 Excel 或 HTML 格式。如果其他用户查看报表并单击呈现的参数内容,则用户可能会无意中执行恶意脚本或链接。 若要降低无意中运行恶意脚本的风险,请仅从可信来源打开呈现的报表。有关保护报表的详细信息,请参阅保护报表和资源

编写映射到多值报表参数的查询

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

  • 数据源必须为 SQL Server、Oracle 或 Analysis Services。
  • 数据源不能是存储过程。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 选择各种值组合,并确保获得预期结果。
Aa337292.note(zh-cn,SQL.90).gif注意:
对于不能将参数处理为数组的数据源,报表服务器将重写该数据源的查询。若要生成所需结果,必须重写查询。将参数定义为多值参数并且查询使用 IN 语句指定参数时,将触发查询重写。注意如果生成不包括 IN 语句的查询,则不使用报表服务器提供的用以支持多值参数的逻辑。

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

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

在表达式中引用参数时,使用全局集合参数。在表达式中使用多值参数时,既需要了解如何处理单个值也需要了解如何处理整组值。下表为设置**“多值”**选项的参数提供了有关参数属性的示例和说明。

示例 说明

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 函数将值转换为字符串或整数。

有关表达式中单值和多值参数的详细信息和示例,请参阅在表达式中使用参数

更改历史记录

发布日期 历史记录

2006 年 12 月 12 日

更改的内容:
  • 在 SP2 中,已恢复“全选”选项。

请参阅

任务

如何添加、编辑或删除报表参数(报表设计器)

概念

设置已发布报表的参数属性
在表达式中使用参数
在表达式中使用参数

其他资源

教程:将参数添加至基本表格报表
教程:使用参数的高级功能
报表参数(报表设计器)

帮助和信息

获取 SQL Server 2005 帮助