将查询参数与特定数据源配合使用 (Reporting Services)
当为数据集定义查询时,您需要选择数据源类型。 数据源类型可指定数据处理扩展插件或用于连接到数据源的已注册 .NET Framework 数据访问接口。 数据访问接口属于软件层,用于与数据源进行交互并确定为在查询中使用变量提供了哪些支持。 本主题说明对于给定的结果集,查询如何根据连接到的数据源和查询中是否包含变量而发生变化。
查询变量和数据访问接口
下表显示了 AdventureWorks 示例数据库中的数据结果。 通过对 AdventureWorks 示例数据库运行 Transact-SQL 查询或者对部署为 AdventureWorks 示例报表一部分的 Adventure Works 多维数据集运行 MDX 查询,可以创建此结果集。 此结果集显示两列:包含“Mountain”字样的产品型号名称以及相应的 Internet 销售次数。
名称 |
InternetSales |
---|---|
Fender Set - Mountain |
2121 |
HL Mountain Tire |
1396 |
LL Mountain Tire |
862 |
ML Mountain Tire |
1161 |
Mountain Bottle Cage |
2025 |
Mountain Tire Tube |
3095 |
Mountain-100 |
396 |
Mountain-200 |
3552 |
Mountain-400-W |
543 |
Mountain-500 |
479 |
Women's Mountain Shorts |
1019 |
以下几节介绍用于创建此结果集的查询,首先针对关系数据库创建,然后针对多维数据库创建。
关系数据库数据源
对于关系数据库(如 MicrosoftSQL Server),您可以使用 Transact-SQL 创建查询。 此查询通过包含设置为硬编码值的 WHERE 子句来限制结果,查询并不包含变量。
Transact-SQL 查询 |
---|
SELECT PM.Name, Count(*) as InternetSales FROM Sales.SalesOrderHeader SOH INNER JOIN Sales.SalesOrderDetail SOD ON SOH.SalesOrderID = SOD.SalesOrderID INNER JOIN Production.Product PP ON SOD.ProductID = PP.ProductID INNER JOIN Production.ProductModel PM ON PP.ProductModelId = PM.ProductModelID WHERE (SOH.OnLineOrderFlag = 1 AND PM.Name LIKE ('%Mountain%')) GROUP BY PM.Name ORDER BY PM.Name |
若要为产品型号名称 PM.Name 添加变量,您需要在 WHERE 子句中指定一个查询参数。 下表说明如何为不同的数据访问接口指定查询参数。 当您选择数据源类型时,会自动为您选择数据访问接口。 该数据访问接口的连接字符串显示在第二列。 此表中的查询与上面的查询相同,只是以数据访问接口支持的格式添加了一个参数。
数据源类型 |
数据访问接口 |
查询 |
---|---|---|
MicrosoftSQL Server |
MicrosoftSQL Server (SqlClient) 连接字符串: Data Source=.;Initial Catalog=AdventureWorks |
SELECT PM.Name, Count(*) FROM Sales.SalesOrderHeader SOH INNER JOIN Sales.SalesOrderDetail SOD ON SOH.SalesOrderID = SOD.SalesOrderID INNER JOIN Production.Product PP ON SOD.ProductID = PP.ProductID INNER JOIN Production.ProductModel PM ON PP.ProductModelId = PM.ProductModelID WHERE (SOH.OnLineOrderFlag = 1 AND (PM.Name LIKE '%' + @Mountain + '%')) GROUP BY PM.Name ORDER BY PM.Name |
OLE DB |
Microsoft OLE DB Provider for SQL Server 连接字符串: Provider=SQLOLEDB.1;Data Source=.;Initial Catalog=AdventureWorks |
SELECT PM.Name, Count(*) FROM Sales.SalesOrderHeader SOH INNER JOIN Sales.SalesOrderDetail SOD ON SOH.SalesOrderID = SOD.SalesOrderID INNER JOIN Production.Product PP ON SOD.ProductID = PP.ProductID INNER JOIN Production.ProductModel PM ON PP.ProductModelId = PM.ProductModelID WHERE ((SOH.OnLineOrderFlag = 1) AND PM.Name LIKE ('%' + ? + '%')) GROUP BY PM.Name ORDER BY PM.Name |
Oracle |
MicrosoftSQL Server (OracleClient) |
SELECT PM.Name, Count(*) FROM Sales.SalesOrderHeader SOH INNER JOIN Sales.SalesOrderDetail SOD ON SOH.SalesOrderID = SOD.SalesOrderID INNER JOIN Production.Product PP ON SOD.ProductID = PP.ProductID INNER JOIN Production.ProductModel PM ON PP.ProductModelId = PM.ProductModelID WHERE ((SOH.OnLineOrderFlag = 1) AND PM.Name LIKE '%' + :1 + '%') GROUP BY PM.Name ORDER BY PM.Name |
OLE DB |
任何已注册的 .NET Framework 数据访问接口 |
特定于访问接口。 |
在这些示例中,查询的 WHERE 子句中加入了变量,将对单词“Mountain”的测试更改为对变量值的测试。
SQL Server 的 .NET 数据访问接口支持以 at (@) 字符开头的命名变量。 例如,PM.Name LIKE '%' + @Mountain + '%')。
OLE DB Provider for SQL Server 不支持命名变量。 可使用问号 (?) 字符指定变量。 传递给 OLE DB 访问接口的参数必须按它们在 WHERE 子句中出现的顺序传递。 例如,PM.Name LIKE ('%' + ? + '%')。
.NET Data Provider for Oracle 支持以冒号 (:) 字符开头的编号参数。 例如,PM.Name LIKE '%' + :1 + '%')。
其他 OLE DB 数据访问接口对变量的支持特定于数据访问接口。 请参阅数据访问接口文档以获得详细信息。
与数据源类型关联的查询设计器为每个标识的变量创建一个查询参数。 数据集属性页的“参数”选项卡上列出了这些查询参数。 对于每个查询参数,将创建 String 类型的报表参数。 为数据集定义的查询参数值将设置为相应的报表参数。 您可以在“报表属性”对话框(可从“数据”视图下的“报表”菜单中访问)中编辑报表参数数据类型和其他属性。 您也可以手动创建、编辑或删除这些查询参数。 有关详细信息,请参阅“数据集属性”对话框 ->“参数”。
多维数据库数据源
对于多维数据库(如 Analysis Services),可以使用 MDX 创建查询。 虽然此查询通过包含设置为硬编码值的 Filter 子句来限制结果,但是此查询并不包含变量。
MDX 查询 |
---|
SELECT NON EMPTY { [Measures].[Internet Order Count] } ON COLUMNS, NON EMPTY { ([Product].[Model Name].[Model Name].ALLMEMBERS ) } DIMENSION PROPERTIES MEMBER_CAPTION, MEMBER_UNIQUE_NAME ON ROWS FROM ( SELECT ( Filter( [Product].[Model Name].[Model Name].ALLMEMBERS, Instr([Product].[Model Name].currentmember.Properties( 'Member_Caption' ), 'Mountain' ) > 0 ) ) ON COLUMNS FROM [Adventure Works]) CELL PROPERTIES VALUE, BACK_COLOR, FORE_COLOR, FORMATTED_VALUE, FORMAT_STRING, FONT_NAME, FONT_SIZE, FONT_FLAGS |
若要为产品型号名称 @ProductModelName 添加变量,您需要添加 FILTER 子句。 下表显示:对于多维数据库,变量为 FILTER 子句的一部分。 数据源类型是在为 Reporting Services 创建新数据源时从下拉列表中选择的值。 当您选择数据源类型时,会自动为您选择数据访问接口。 此数据访问接口的连接字符串也显示在第二列。 此表中的查询与上面的查询相同,只是以数据访问接口支持的格式添加了一个参数。
数据源类型 |
数据访问接口 |
查询 |
---|---|---|
MicrosoftSQL ServerAnalysis Services |
SQL ServerAnalysis Services (AdomdClient) 连接字符串: Data Source=.;Initial Catalog="Adventure Works DW" |
SELECT NON EMPTY { [Measures].[Internet Order Count] } ON COLUMNS, NON EMPTY { ([Product].[Model Name].[Model Name].ALLMEMBERS ) } DIMENSION PROPERTIES MEMBER_CAPTION, MEMBER_UNIQUE_NAME ON ROWS FROM ( SELECT ( Filter( [Product].[Model Name].[Model Name].ALLMEMBERS, Instr( [Product].[Model Name].currentmember.Properties( 'Member_Caption' ), @ProductModelName ) > 0 ) ) ON COLUMNS FROM [Adventure Works]) CELL PROPERTIES VALUE, BACK_COLOR, FORE_COLOR, FORMATTED_VALUE, FORMAT_STRING, FONT_NAME, FONT_SIZE, FONT_FLAGS |
OLE DB |
Microsoft OLE DB Provider for Analysis Services 9.0 连接字符串: Provider=MSOLAP.3;Data Source=.;Initial Catalog="Adventure Works DW" |
OLE DB for OLAP 不支持参数化查询。 “Analysis Services 与 Reporting Services 的集成”白皮书中介绍了解决方法。 |
在这些示例中,查询的 WHERE 子句中添加了变量,将对单词“Mountain”的测试更改为对变量值的测试。
MicrosoftSQL ServerAnalysis Services 支持在 MDX 查询设计器的“筛选器”部分中定义的命名参数。 命名变量以 at (@) 字符开头。 例如,@ProductModelName。
Microsoft OLE DB Provider for Analysis Services 9.0 不支持参数化查询。 有关详细信息,请在 msdn.microsoft.com 上搜索“Integrating Analysis Services with Reporting Services”(Analysis Services 与 Reporting Services 的集成)。
其他多维数据访问接口对变量的支持特定于数据访问接口。 请参阅数据访问接口文档以获得详细信息。
与数据源类型关联的查询设计器为每个标识的变量创建一个查询参数。 将自动创建特定数据集以为每个参数提供有效值。 数据集属性页的“参数”选项卡上列出了这些查询参数。 对于每个查询参数,将创建 String 类型的报表参数。 为数据集定义的查询参数值将设置为相应的报表参数。 您也可以手动创建、编辑或删除这些数据集参数。 有关详细信息,请参阅如何在 Analysis Services 的 MDX 查询设计器中定义参数。
无论何时,只要处理查询,就会创建为该查询提供有效值的数据集。