定义未知成员和空值处理属性

Microsoft SQL Server 2005 Analysis Services (SSAS) 处理某个维度时,将用数据源视图中表或视图的基础列中的所有非重复值来填充该维度中的属性。如果 Analysis Services 在处理过程中遇到空值,默认情况下,它会将此空值转换为数值列的零,或转换为字符串列的空字符串,因此不引发任何错误。您可以在基础关系数据仓库的提取、转换和加载过程(如果有)中修改这些默认设置或转换空值。您也可以通过配置以下三个属性使 Analysis Service 将空值转换为指定值:用于维度的 UnknownMemberUnknownMemberName 属性以及用于维度键特性的 NullProcessing 属性。

根据维度的键特性是否可为空或者雪花型维度的根特性是否基于可为空的列,维度向导和多维数据集向导将正确启用这些属性。在这些情况下,键特性的 NullProcessing 属性将设置为 UnknownMember,而 UnknownMember 属性将设置为 Visible

ms170707.note(zh-cn,SQL.90).gif注意:
未知成员的默认值为 Unknown。可以通过设置 UnknownMemberName 属性的值来指定一个不同的值。

但是,当以增量方式生成雪花型维度(正如我们在本教程中处理 Product 维度的方式)时,或使用“维度设计器”定义维度然后将这些现有维度合并到多维数据集中时,可能需要手动设置 UnknownMemberNullProcessing 属性。

您在下面的任务中将会看到,当 Analysis Services 处理雪花型维度时,Analysis Services 将删除其值对于链接该雪花状表的列来说为空的特性成员,除非您修改特定属性的设置。因为默认情况下 Analysis Services 会忽略此类错误,所以不会发生任何错误;NullKeyCovertedToUnknown 属性默认设置为 IgnoreError。Analysis Services 将删除包含空值的属性成员,因为它处理的是两个雪花状表之间的内部联接。

可以执行下列步骤,控制 Analysis Services 在这种情况下执行处理的方式:

  • 启用维度的 UnknownMember 属性。
  • 为维度的 UnknownMemberName 属性指定一个值。
  • 设置与维度属性链接的相应属性关系。
  • 为将雪花状表链接在一起的键列定义自定义错误处理。

在本主题的各项任务中,将在雪花状表的 Product 维度中添加产品类别和产品子类别属性,这些雪花表将被添加到 Adventure Works DW 数据源视图中。然后,启用 Product 维度的 UnknownMember 属性;将**“程序集组件”指定为 UnknownMemberName 属性的值;建立“子类别”“类别”**属性与产品名称属性之间的关系;最后,为与雪花状表链接的成员键属性定义自定义错误处理。

ms170707.note(zh-cn,SQL.90).gif注意:
如果在最初使用多维数据集向导定义 Analysis Services Tutorial 多维数据集时添加了“子类别”和“类别”属性,则会自动执行这些步骤。

查看 Product 维度中的错误处理和未知成员属性

查看 Product 维度中的错误处理和未知成员属性

  1. 切换到 Product 维度的维度设计器,单击**“维度结构”选项卡,然后在“属性”窗格中选择“产品”**。

    此时,您可以查看和修改该维度自身的属性。

  2. 在“属性”窗口中,查看 UnknownMemberUnknownMemberName 属性。

    注意,UnknownMember 属性未被启用,因为该属性的值设置为 None 而不是 VisibleHidden,并且没有为 UnknownMemberName 属性指定名称。

  3. 在“属性”窗口的 ErrorConfiguration 属性单元格中,选择**“(自定义)”**,再展开 ErrorConfiguration 属性集合。

    ErrorConfiguration 属性设置为**“(自定义)”**允许您查看默认错误配置设置,但不会更改任何设置。

  4. 检查键和空键错误配置属性,但不进行任何更改。

    注意,默认情况下,如果空键被转换为未知成员,则将忽略与此转换相关联的处理错误。

    下图显示了 ErrorConfiguration 属性集合的属性设置。

    ErrorConfiguration 属性集合

  5. 单击**“浏览器”选项卡,验证已在“层次结构”列表中选中了“产品型号系列”,然后展开“所有产品”**。

    注意“产品系列”级别的五个成员。

  6. 展开**“组件”,再展开“型号名称”**级别的未标记成员。

    此级别包含生成其他组件时使用的部件组件(从 Adjustable Race 产品开始),如下图所示。

    用于生成其他组件的程序集组件

从雪花状表和“产品类别”用户定义层次结构定义属性

从雪花状表和“产品类别”用户定义层次结构定义属性

  1. 打开 Adventure Works DW 数据源视图的数据源视图设计器,在**“关系图组织程序”窗格中选择“分销商销售”,再在 Business Intelligence Development Studio 的“数据源视图”菜单上单击“添加/删除表”**。

    此时将打开**“添加/删除表”**对话框。

  2. 在**“包含的对象”列表中,选择 dbo.DimProduct,再单击“添加相关表”**。

    dbo.DimProductSubcategory 表即被添加到**“包含的对象”**列表中。

  3. dbo.DimProductSubcategory 表被默认选定为最新添加的表的情况下,再次单击**“添加相关表”**。

    **“dbo.DimProductCategory”表即被添加到“包含的对象”**列表中。

  4. 单击**“确定”**。

  5. 在 BI Development Studio 的**“格式”菜单上,指向“自动布局”,再单击“关系图”**。

    注意,dbo.DimProductSubcategory 表和 dbo.DimProductCategory 表互相链接,并且还通过 Product 表链接到 ResellerSales 表,如下图所示。

    显示表与表之间的链接的关系图

  6. 切换到 Product 维度的维度设计器,再单击**“维度结构”**选项卡。

  7. 右键单击**“数据源视图”窗格中的任意位置,再单击“显示所有表”**。

  8. 在**“数据源视图”窗格中,找到 DimProductCategory 表,右键单击该表中的 ProductCategoryKey,再单击“从列新建属性”**。

  9. 在**“属性”窗格中,将此新属性的名称更改为“类别”**。

  10. 在**“属性”窗口中,单击 NameColumn 属性单元格,选择“(新建)”,然后在“对象绑定”对话框的“源表”字段和“源列”字段中分别指定 DimProductCategoryEnglishProductCategoryName,然后单击“确定”**。

  11. 在**“数据源视图”窗格中,找到 DimProductSubcategory 表,右键单击该表中的 ProductSubcategoryKey,再单击“从列新建属性”**。

  12. 在**“属性”窗格中,将此新属性的名称更改为“子类别”**。

  13. 在**“属性”窗口中,单击 NameColumn 属性单元格,选择“(新建)”,再在“对象绑定”对话框的“源表”字段中指定 DimProductSubcategory,在“源列”字段中指定 EnglishProductSubcategoryName,再单击“确定”**。

  14. 创建一个名为**“产品类别”的新用户定义层次结构,该层次结构从上至下包含下列级别:“类别”“子类别”“产品名称”**。

  15. 将“所有产品”指定为“产品类别”用户定义层次结构的 AllMemberName 属性的值。

浏览 Product 维度中的用户定义层次结构

浏览 Product 维度中的用户定义层次结构

  1. Product 维度的**“维度设计器”“维度结构”选项卡工具栏上,单击“处理”**。

  2. 单击**“是”以生成并部署项目,再单击“运行”**来处理 Product 维度。

  3. 成功处理后,在**“处理进度”对话框中展开“处理维度‘产品’已成功完成”,展开“处理维度属性‘产品名称’已成功完成”,再展开“SQL 查询 1”**。

  4. 单击 SELECT DISTINCT 查询,再单击**“查看详细信息”**。

    注意,WHERE 子句已添加到 SELECT DISTINCT 子句中,这将删除 ProductSubcategoryKey 列中不包含值的那些产品,如下图所示。

    显示 WHERE 子句的 SELECT DISTINCT 子句

  5. 依次单击**“关闭”**三次,关闭所有处理对话框。

  6. 单击 Product 维度的维度设计器中的**“浏览器”选项卡,再单击“重新连接”**。

  7. 验证**“产品型号系列”是否出现在“层次结构”列表中,展开“所有产品”,再展开“组件”**。

    注意,没有列出所有部件组件列表,因为在 SELECT DISTINCT 语句中使用了 WHERE 子句,如下图所示。

    显示缺少的组件的层次结构列表

  8. 选择**“层次结构”列表中的“产品类别”,展开“所有产品”,再展开“组件”**。

    注意,没有显示部件组件。

若要修改前一个任务中提到的行为,需要执行以下步骤:启用 Product 维度的 UnknownMember 属性,设置 UnknownMemberName 属性的值,将**“子类别”“型号名称”特性的 NullProcessing 属性设置为 UnknownMember,将“类别”特性定义为“子类别”特性的相关特性,再将“产品系列”特性定义为“型号名称”**特性的相关特性。以上步骤将使 Analysis Services 对在 SubcategoryKey 键列中不包含值的每个产品使用未知成员名称值,如以下任务所示。

启用未知成员,定义属性关系,并指定空值的自定义处理属性

启用未知成员,定义属性关系,并指定空值的自定义处理属性

  1. 单击 Product 维度的维度设计器中的**“维度结构”**选项卡。

  2. 在**“属性”窗口中,将 Product 维度的 UnknownMember 属性更改为 Visible,再将此维度的 UnknownMemberName 属性值更改为“程序集组件”**。

    UnknownMember 属性更改为 VisibleHidden 后,就会启用该维度的 UnknownMember 属性。

  3. 在**“属性”**窗格中,展开下列属性:

    • 产品名称
    • 子类别
    • 型号名称

    注意,**“产品系列”“型号名称”属性相关,并通过该属性间接链接至“产品名称”键属性。注意,尚未为“子类别”属性定义属性关系,“类别”属性直接通过键属性链接至“产品名称”**属性。

  4. 将**“类别”属性关系从“产品名称”属性拖至“子类别”**属性。

    现在,**“类别”属性通过“子类别”属性链接到事实数据表中的行,而“子类别”属性又通过“产品名称”**属性链接到事实数据表中的行。

  5. 在**“属性”窗格中,选择“子类别”,然后在“属性”窗口的 KeyColumns 属性单元格中单击省略号按钮 (…**)。

  6. 在**“DataItem 集合编辑器”**对话框中,将 NullProcessing 属性更改为 UnknownMember,如下图所示。

    “DataItem 集合编辑器”对话框

  7. 单击**“确定”**。

  8. 在**“属性”窗格中,选择“型号名称”,再在“属性”窗口的 KeyColumns 属性单元格中单击省略号按钮 (…**)。

  9. 在**“DataItem 集合编辑器”对话框中,将 NullProcessing 属性更改为 UnknownMember,再单击“确定”**。

    由于进行了上述更改,因此 Analysis Services 在处理期间遇到“子类别”属性或“型号名称”属性的空值时,会用未知成员值作为键值进行替换,并将正确构建用户定义层次结构。

再次浏览 Product 维度

浏览 Product 维度

  1. 在**“生成”菜单上,单击“部署 Analysis Services 教程”**。

  2. 成功完成部署后,单击 Product 维度的维度设计器中的**“浏览器”选项卡,再单击“重新连接”**。

  3. 验证在**“层次结构”列表中已选中了“产品类别”,然后展开“所有产品”**。

    注意,“程序集组件”已显示为“类别”级别的新成员。

  4. 展开**“类别”级别的“程序集组件”成员,再展开“子类别”级别的“程序集组件”**成员。

    注意,在**“产品名称”**级别上显示了所有程序集组件,如下图所示。

    显示程序集组件的“产品名称”级别

  5. 在**“层次结构”列表中选择“产品型号系列”,依次展开“所有产品”“产品系列”级别的“程序集组件”成员以及“型号名称”级别的“程序集组件”**成员。

    注意,在**“产品名称”**级别上显示了所有程序集组件。

ms170707.note(zh-cn,SQL.90).gif注意:
通过下载并安装已更新的示例,可以获得第 4 课中使用的完整项目。有关详细信息,请参阅安装示例中的“获取已更新的示例”。

下一课

第 5 课:定义维度和度量值组之间的关系