1:创建新报表
在开始使用动态查询之前,您必须首先创建一个带有报表的报表服务器项目,然后向该项目中添加一个报表项。
创建报表服务器项目
在 Business Intelligence Development Studio 中,报表包含在报表服务器项目中。
创建新的报表服务器项目
1. 单击“开始”,依次指向“程序”和 Microsoft SQL Server 2005,再单击 Business Intelligence Development Studio。
2. 在“文件”菜单上,指向“新建”,再单击“项目”。
3. 在“项目类型”列表中,单击“商业智能项目”。
4. 在“模板”列表中,单击“报表服务器项目”。
5. 在“名称”中,键入 Dynamic Query Tutorial。
6. 单击“确定”以创建项目。
创建报表
创建报表定义文件
1. 在解决方案资源管理器中,右键单击“报表”,指向“添加”,再单击“新建项”。
注意:
如果未显示解决方案资源管理器窗口,请在“视图”菜单中单击解决方案资源管理器。
2. 在“添加新项”中,单击“报表”。
3. 在“名称”中,键入 Employee List.rdl,再单击“添加”。此时,系统将打开一个包含“数据”、“布局”和“预览”选项卡的视图。这是 Business Intelligence Development Studio 的报表设计器组件。系统将在“数据”视图中打开此报表。
2:创建 Employees 数据集
该报告将根据名为 Employees 的数据集显示员工列表。在 Reporting Services 中,数据集可以指定数据源连接和检索数据的查询。
创建数据源和数据集
创建数据源和数据集
1. 在数据视图顶部的“数据集”中,选择“新建数据集”。此时,将显示“数据源”对话框。
2. 在“名称”中,键入 AdventureWorks。
3. 在“类型”中,选择 Microsoft SQL Server。
4. 在“连接字符串”中,键入以下内容:
Data source=(local); initial catalog=AdventureWorks
注意:
此连接字符串假定 Business Intelligence Development Studio、报表服务器和 AdventureWorks 数据库都安装在本地计算机上,并且您有权登录 AdventureWorks 数据库。有关连接字符串的详细信息,请参阅连接数据源和数据源(“常规”选项卡,报表设计器)。
5. 单击“确定”。AdventureWorks 将添加到“数据集”窗格中。
重命名数据集
如果报表或项目中没有其他数据源,则创建的第一个数据源将按所选数据库命名。由于此报表将包含两个数据集,所以应使用更具说明性的名称重命名第一个数据集。若要更改数据集的名称,需要执行下列步骤。
重命名数据集
1. 在工具栏上单击“编辑所选的数据集”(...) 按钮。
2. 在“名称”中,键入 Employees。
3. 单击“确定”。
在数据集中添加查询
Employees 数据集从 AdventureWorks 数据库检索员工数据。
在数据集中添加查询
1. 在“数据”视图中,在通用查询设计器的顶部窗格中键入或者复制并粘贴以下查询:
复制到剪贴板
Select c.firstname, c.lastname, e.title, d.departmentID From HumanResources.EmployeeDepartmentHistory D INNER JOIN HumanResources.Employee E ON D.EmployeeID = E.EmployeeID INNER JOIN Person.Contact C ON E.ContactID = C.ContactID Where D.DepartmentID=1 Order By c.lastname
此查询以后将变为一个表达式;如果首先创建一个基本查询,报表设计器就能自动创建字段列表。如果一开始就编写表达式,则必须手动更新字段列表。
2. 若要查看查询的结果,请单击查询设计器工具栏上的“运行”(!) 按钮。
3:创建部门数据集
此报表使用的参数将最终按照所选部门来筛选 Employee 数据集。参数列表中的值由 Department 数据集填充。
创建数据集
创建数据集
1. 在数据视图顶部的“数据集”中,选择“新建数据集”。“数据集”对话框随即出现。
注意:
如果已为报表提供了数据源,则报表设计器将显示“数据集”对话框而不是“数据源”对话框。创建 Employee 数据集时已定义了数据源。
2. 在“名称”中,键入 Departments。
3. 单击“确定”。
向数据集添加查询
Department 数据集将为本教程后面定义的 Deparment 参数填充可用值列表。
向数据集添加查询
1. 在“数据”视图中,选中 Department 数据集后,在通用查询设计器的顶部窗格中键入或复制和粘贴以下查询:
复制到剪贴板
SELECT 0 AS DepartmentID, 'All' AS Name UNION SELECT DepartmentID, Name FROM HumanResources.Department ORDER BY Name
此 UNION 查询将创建一个部门列表,在此列表顶部包含词“All”。
注意:
默认情况下,通用查询设计器显示在“数据”视图中。尽管也可以使用图形查询设计器编辑查询;但还是应该始终使用通用查询设计器编辑 UNION 查询。
2. 若要查看查询的结果,请单击查询设计器工具栏的“运行 (!)”按钮。
4:定义报表布局
因为已定义了数据集,您现在可以向报表中添加表数据区域了。数据区域是一种数据绑定报表项。添加到报表中的表数据区域将包含 Employees 数据集中的数据。第一次打开表数据区域时,表数据区域包含三行三列。每个行用于指定以下信息:
• 表头
• 详细信息
• 表尾
在本教程中,表格表头和表尾不是直接指定的。因此,您将只使用“详细信息”部分来指定重复的雇员数据行。将字段拖到“详细信息”部分时,会自动指定表格表头,而根本不会使用表格的表尾部分。
添加表数据区域
向报表添加表数据区域和字段
1. 单击“布局”选项卡。
2. 在“工具箱”中,单击“表”,再单击设计图面。报表设计器将在设计图面的宽度内绘制一个具有三列的表。
此时,“工具箱”可能显示为设计区域左侧的一个选项卡。若要打开“工具箱”,请将指针移到“工具箱”选项卡上。
注意:
如果“工具箱”不可见,请单击“视图”菜单中的“工具箱”。
3. 在“数据集”窗口中,展开 Employees。
4. 将 FirstName 字段从“数据集”窗口拖到该表中第一列的中间(详细信息)行中。
注意:
如果“数据集”窗口不可见,请单击“视图”菜单中的“数据集”。
5. 将 LastName 字段从“字段”窗口拖到该表第二列的中间(详细信息)行中。
6. 将 title 字段从“字段”窗口拖到该表第三列的中间(详细信息)行中。
5:添加报表参数
在本课程中,将添加一个报表参数以筛选由查询返回的数据。报表基于用户所选的部门筛选数据。
本教程中的动态查询基于参数值构造。如果将参数数据直接合并到动态查询中,则必须使用可用值列表(也称为有效值);否则,您的报表服务器将容易受到攻击。报表服务器依据可用值列表验证用户的输入,并仅允许使用该列表中的值。这样,您可以控制动态查询中使用的值,并保证报表的安全。但是,如果没有使用可用值列表(“可用值”设置为“无查询”,并且值列表保留空白),并且数据类型为“字符串”,则系统将向用户显示一个可以使用任何值的文本框。在这种情况下,报表用户可能在该文本框中键入 SQL 语法,从而导致报表和服务器容易受到 SQL 注入攻击。如果用户有足够的权限执行新的 SQL 语句,则可能在服务器上产生意外结果。在任何从参数直接合并数据的查询中,请务必使用可用值列表,并确保运行报表的用户仅具有查看报表中数据所需的权限。
添加报表参数
添加参数
1. 在“报表”菜单上,单击“报表参数”。
注意:
如果“报表”菜单不可用,则单击“布局”选项卡。
2. 单击“添加”以添加新的报表参数。
3. 按照以下方式设置参数属性:
o 对于“名称”和“提示”,请键入 Department。
o 对于“数据类型”,请选择“字符串”。
o 清除下列复选框:“隐藏、内部、多值”、“允许空值”以及“允许空白值”。
o 对于“可用值”,请选择“来自查询”。
o 对于“数据集”,请选择“部门”。对于“值字段”,请选择 DepartmentID。对于“标签字段”,请选择“名称”。
o 对于“默认值”,请选择“无查询”。
o 在“无查询”旁边的框中,键入 0。
4. 单击“确定”。
5. 单击“预览”选项卡。该表将基于静态查询显示一部分员工列表 (DepartmentID = 1)。这时参数不筛选数据。
6:使用动态查询更新 Employees 数据集
在 Employees 数据集中使用静态查询的报表应在正确运行。以下步骤将静态查询替换为动态查询。
动态查询的值为表达式。查询构造为表达式时,不能在查询设计器中使用 Run (!) 命令验证语法,也不能确认语法是否返回了期望的结果。若要检查语法,请预览报表以确保处理后的报表包含数据。
添加动态查询
若要在报表定义中添加动态查询,请执行以下操作:
1. 单击“数据”选项卡。
2. 选择 Employees 数据集,再使用通用查询设计器,将原始查询替换为以下表达式:
复制到剪贴板
="SELECT c.firstname, c.lastname, e.title, d.departmentID " & "From HumanResources.EmployeeDepartmentHistory D " & "INNER JOIN HumanResources.Employee E " & "ON D.EmployeeID = E.EmployeeID " & "INNER JOIN Person.Contact C " & "ON E.ContactID = C.ContactID " & Iif(Parameters!Department.Value = 0, "", "WHERE D.DepartmentID = " & Parameters!Department.Value) & "ORDER BY C.LastName"
仅当未选择 All 时,此表达式才生成包含 WHERE 子句的查询。WHERE 子句包含 Department 参数中的值。 必须使用通用查询设计器创建表达式。
3. 保存报表项目。在“文件”菜单上,单击“全部保存”。
4. 单击“预览”选项卡。默认情况下,显示所有雇员。如果选择了特定部门后查看报表,则将显示该部门的雇员。
注意 每次运行报表时,都将在 Employees 数据集中使用表达式生成一个查询字符串。如果选中 All (内部 DepartmentID 值为 0),则生成的查询不带 WHERE 子句,这将导致检索所有雇员。如果 选择一个部门,则将在 WHERE 子句中使用选定部门的 DepartmentID 构造查询,并将数据限制为该部门的数据。
在开始使用动态查询之前,您必须首先创建一个带有报表的报表服务器项目,然后向该项目中添加一个报表项。
创建报表服务器项目
在 Business Intelligence Development Studio 中,报表包含在报表服务器项目中。
创建新的报表服务器项目
1. 单击“开始”,依次指向“程序”和 Microsoft SQL Server 2005,再单击 Business Intelligence Development Studio。
2. 在“文件”菜单上,指向“新建”,再单击“项目”。
3. 在“项目类型”列表中,单击“商业智能项目”。
4. 在“模板”列表中,单击“报表服务器项目”。
5. 在“名称”中,键入 Dynamic Query Tutorial。
6. 单击“确定”以创建项目。
创建报表
创建报表定义文件
1. 在解决方案资源管理器中,右键单击“报表”,指向“添加”,再单击“新建项”。
注意:
如果未显示解决方案资源管理器窗口,请在“视图”菜单中单击解决方案资源管理器。
2. 在“添加新项”中,单击“报表”。
3. 在“名称”中,键入 Employee List.rdl,再单击“添加”。此时,系统将打开一个包含“数据”、“布局”和“预览”选项卡的视图。这是 Business Intelligence Development Studio 的报表设计器组件。系统将在“数据”视图中打开此报表。
2:创建 Employees 数据集
该报告将根据名为 Employees 的数据集显示员工列表。在 Reporting Services 中,数据集可以指定数据源连接和检索数据的查询。
创建数据源和数据集
创建数据源和数据集
1. 在数据视图顶部的“数据集”中,选择“新建数据集”。此时,将显示“数据源”对话框。
2. 在“名称”中,键入 AdventureWorks。
3. 在“类型”中,选择 Microsoft SQL Server。
4. 在“连接字符串”中,键入以下内容:
Data source=(local); initial catalog=AdventureWorks
注意:
此连接字符串假定 Business Intelligence Development Studio、报表服务器和 AdventureWorks 数据库都安装在本地计算机上,并且您有权登录 AdventureWorks 数据库。有关连接字符串的详细信息,请参阅连接数据源和数据源(“常规”选项卡,报表设计器)。
5. 单击“确定”。AdventureWorks 将添加到“数据集”窗格中。
重命名数据集
如果报表或项目中没有其他数据源,则创建的第一个数据源将按所选数据库命名。由于此报表将包含两个数据集,所以应使用更具说明性的名称重命名第一个数据集。若要更改数据集的名称,需要执行下列步骤。
重命名数据集
1. 在工具栏上单击“编辑所选的数据集”(...) 按钮。
2. 在“名称”中,键入 Employees。
3. 单击“确定”。
在数据集中添加查询
Employees 数据集从 AdventureWorks 数据库检索员工数据。
在数据集中添加查询
1. 在“数据”视图中,在通用查询设计器的顶部窗格中键入或者复制并粘贴以下查询:
复制到剪贴板
Select c.firstname, c.lastname, e.title, d.departmentID From HumanResources.EmployeeDepartmentHistory D INNER JOIN HumanResources.Employee E ON D.EmployeeID = E.EmployeeID INNER JOIN Person.Contact C ON E.ContactID = C.ContactID Where D.DepartmentID=1 Order By c.lastname
此查询以后将变为一个表达式;如果首先创建一个基本查询,报表设计器就能自动创建字段列表。如果一开始就编写表达式,则必须手动更新字段列表。
2. 若要查看查询的结果,请单击查询设计器工具栏上的“运行”(!) 按钮。
3:创建部门数据集
此报表使用的参数将最终按照所选部门来筛选 Employee 数据集。参数列表中的值由 Department 数据集填充。
创建数据集
创建数据集
1. 在数据视图顶部的“数据集”中,选择“新建数据集”。“数据集”对话框随即出现。
注意:
如果已为报表提供了数据源,则报表设计器将显示“数据集”对话框而不是“数据源”对话框。创建 Employee 数据集时已定义了数据源。
2. 在“名称”中,键入 Departments。
3. 单击“确定”。
向数据集添加查询
Department 数据集将为本教程后面定义的 Deparment 参数填充可用值列表。
向数据集添加查询
1. 在“数据”视图中,选中 Department 数据集后,在通用查询设计器的顶部窗格中键入或复制和粘贴以下查询:
复制到剪贴板
SELECT 0 AS DepartmentID, 'All' AS Name UNION SELECT DepartmentID, Name FROM HumanResources.Department ORDER BY Name
此 UNION 查询将创建一个部门列表,在此列表顶部包含词“All”。
注意:
默认情况下,通用查询设计器显示在“数据”视图中。尽管也可以使用图形查询设计器编辑查询;但还是应该始终使用通用查询设计器编辑 UNION 查询。
2. 若要查看查询的结果,请单击查询设计器工具栏的“运行 (!)”按钮。
4:定义报表布局
因为已定义了数据集,您现在可以向报表中添加表数据区域了。数据区域是一种数据绑定报表项。添加到报表中的表数据区域将包含 Employees 数据集中的数据。第一次打开表数据区域时,表数据区域包含三行三列。每个行用于指定以下信息:
• 表头
• 详细信息
• 表尾
在本教程中,表格表头和表尾不是直接指定的。因此,您将只使用“详细信息”部分来指定重复的雇员数据行。将字段拖到“详细信息”部分时,会自动指定表格表头,而根本不会使用表格的表尾部分。
添加表数据区域
向报表添加表数据区域和字段
1. 单击“布局”选项卡。
2. 在“工具箱”中,单击“表”,再单击设计图面。报表设计器将在设计图面的宽度内绘制一个具有三列的表。
此时,“工具箱”可能显示为设计区域左侧的一个选项卡。若要打开“工具箱”,请将指针移到“工具箱”选项卡上。
注意:
如果“工具箱”不可见,请单击“视图”菜单中的“工具箱”。
3. 在“数据集”窗口中,展开 Employees。
4. 将 FirstName 字段从“数据集”窗口拖到该表中第一列的中间(详细信息)行中。
注意:
如果“数据集”窗口不可见,请单击“视图”菜单中的“数据集”。
5. 将 LastName 字段从“字段”窗口拖到该表第二列的中间(详细信息)行中。
6. 将 title 字段从“字段”窗口拖到该表第三列的中间(详细信息)行中。
5:添加报表参数
在本课程中,将添加一个报表参数以筛选由查询返回的数据。报表基于用户所选的部门筛选数据。
本教程中的动态查询基于参数值构造。如果将参数数据直接合并到动态查询中,则必须使用可用值列表(也称为有效值);否则,您的报表服务器将容易受到攻击。报表服务器依据可用值列表验证用户的输入,并仅允许使用该列表中的值。这样,您可以控制动态查询中使用的值,并保证报表的安全。但是,如果没有使用可用值列表(“可用值”设置为“无查询”,并且值列表保留空白),并且数据类型为“字符串”,则系统将向用户显示一个可以使用任何值的文本框。在这种情况下,报表用户可能在该文本框中键入 SQL 语法,从而导致报表和服务器容易受到 SQL 注入攻击。如果用户有足够的权限执行新的 SQL 语句,则可能在服务器上产生意外结果。在任何从参数直接合并数据的查询中,请务必使用可用值列表,并确保运行报表的用户仅具有查看报表中数据所需的权限。
添加报表参数
添加参数
1. 在“报表”菜单上,单击“报表参数”。
注意:
如果“报表”菜单不可用,则单击“布局”选项卡。
2. 单击“添加”以添加新的报表参数。
3. 按照以下方式设置参数属性:
o 对于“名称”和“提示”,请键入 Department。
o 对于“数据类型”,请选择“字符串”。
o 清除下列复选框:“隐藏、内部、多值”、“允许空值”以及“允许空白值”。
o 对于“可用值”,请选择“来自查询”。
o 对于“数据集”,请选择“部门”。对于“值字段”,请选择 DepartmentID。对于“标签字段”,请选择“名称”。
o 对于“默认值”,请选择“无查询”。
o 在“无查询”旁边的框中,键入 0。
4. 单击“确定”。
5. 单击“预览”选项卡。该表将基于静态查询显示一部分员工列表 (DepartmentID = 1)。这时参数不筛选数据。
6:使用动态查询更新 Employees 数据集
在 Employees 数据集中使用静态查询的报表应在正确运行。以下步骤将静态查询替换为动态查询。
动态查询的值为表达式。查询构造为表达式时,不能在查询设计器中使用 Run (!) 命令验证语法,也不能确认语法是否返回了期望的结果。若要检查语法,请预览报表以确保处理后的报表包含数据。
添加动态查询
若要在报表定义中添加动态查询,请执行以下操作:
1. 单击“数据”选项卡。
2. 选择 Employees 数据集,再使用通用查询设计器,将原始查询替换为以下表达式:
复制到剪贴板
="SELECT c.firstname, c.lastname, e.title, d.departmentID " & "From HumanResources.EmployeeDepartmentHistory D " & "INNER JOIN HumanResources.Employee E " & "ON D.EmployeeID = E.EmployeeID " & "INNER JOIN Person.Contact C " & "ON E.ContactID = C.ContactID " & Iif(Parameters!Department.Value = 0, "", "WHERE D.DepartmentID = " & Parameters!Department.Value) & "ORDER BY C.LastName"
仅当未选择 All 时,此表达式才生成包含 WHERE 子句的查询。WHERE 子句包含 Department 参数中的值。 必须使用通用查询设计器创建表达式。
3. 保存报表项目。在“文件”菜单上,单击“全部保存”。
4. 单击“预览”选项卡。默认情况下,显示所有雇员。如果选择了特定部门后查看报表,则将显示该部门的雇员。
注意 每次运行报表时,都将在 Employees 数据集中使用表达式生成一个查询字符串。如果选中 All (内部 DepartmentID 值为 0),则生成的查询不带 WHERE 子句,这将导致检索所有雇员。如果 选择一个部门,则将在 WHERE 子句中使用选定部门的 DepartmentID 构造查询,并将数据限制为该部门的数据。