数据源和绑定(SSAS 多维)

多维数据集、维度和其他 Analysis Services 对象可以绑定到数据源。 数据源可以是下列对象之一:

  • 关系数据源。

  • 一个 Analysis Services 管道,用于输出行集(或分章行集)。

表示数据源的方法因数据源的类型而异。 例如,关系数据源由连接字符串区分。 有关数据源的详细信息,请参阅 多维模型中的数据源

无论使用的数据源如何,数据源视图(DSV)都包含数据源的元数据。 因此,立方体或其他 Analysis Services 对象的绑定被表示为对 DSV 的绑定。 这些绑定可以包括对逻辑对象(例如视图、计算列和数据源中不存在的物理关系)的绑定。 Analysis Services 将一个包含表达式的计算列添加到 DSV,然后将相应的 OLAP 度量绑定到 DSV 中的该列。 有关 DSV 的详细信息,请参阅 多维模型中的数据源视图

每个 Analysis Services 对象都以自己的方式绑定到数据源。 此外,可以将这些对象的数据绑定和数据源的定义与数据绑定对象(例如维度)的定义一起内嵌提供,或者作为一组单独的定义独立提供。

Analysis Services 数据类型

绑定中使用的数据类型必须与 Analysis Services 支持的数据类型匹配。 Analysis Services 中定义了以下数据类型:

Analysis Services 数据类型 DESCRIPTION
BigInt 64 位有符号整数。 此数据类型映射到 Microsoft .NET Framework 中的 Int64 数据类型和 OLE DB 中的DBTYPE_I8数据类型。
布尔值 布尔值。 此数据类型映射到 .NET Framework 中的布尔数据类型和 OLE DB 中的DBTYPE_BOOL数据类型。
货币 货币值,从 -263(或 -922,337,203,685,477.5808)到 263-1(或 +922,337,203,685,477.5807),准确度为货币单位的十万分之一。 此数据类型映射到 .NET Framework 中的 Decimal 数据类型和 OLE DB 中的DBTYPE_CY数据类型。
日期 日期数据,存储为双精度浮点数。 整个部分是自 1899 年 12 月 30 日以来的天数,而小数部分为一天的一小部分。 此数据类型映射到 .NET Framework 中的 DateTime 数据类型和 OLE DB 中的DBTYPE_DATE数据类型。
加倍 -1.79E+308 到 1.79E+308 范围内的双精度浮点数。 此数据类型映射到 .NET Framework 中的 Double 数据类型和 OLE DB 中的 DBTYPE_R8 数据类型。
整数 32 位有符号整数。 此数据类型映射到 .NET Framework 中的 Int32 数据类型和 OLE DB 中的DBTYPE_I4数据类型。
单身 -3.40E +38 到 3.40E +38 范围内的单精度浮点数。 此数据类型映射到 .NET Framework 中的单个数据类型和 OLE DB 中的DBTYPE_R4数据类型。
SmallInt 16 位有符号整数。 此数据类型映射到 .NET Framework 中的 Int16 数据类型和 OLE DB 中的DBTYPE_I2数据类型。
TinyInt 8 位有符号整数。 此数据类型映射到 .NET Framework 中的 SByte 数据类型和 OLE DB 中的DBTYPE_I1数据类型。

注意:如果数据源包含属于 tinyint 数据类型的字段,并且 AutoIncrement 属性设置为 True,则它们将转换为数据源视图中的整数。
无符号大整数 64 位无符号整数。 此数据类型映射到 .NET Framework 中的 UInt64 数据类型和 OLE DB 中的DBTYPE_UI8数据类型。
无符号整数 32 位无符号整数。 此数据类型映射到 .NET Framework 中的 UInt32 数据类型和 OLE DB 中的DBTYPE_UI4数据类型。
无符号小整数 16 位无符号整数。 此数据类型映射到 .NET Framework 中的 UInt16 数据类型和 OLE DB 中的DBTYPE_UI2数据类型。
WChar 以 null 结尾的 Unicode 字符流。 此数据类型映射到 .NET Framework 中的 String 数据类型和 OLE DB 中的DBTYPE_WSTR数据类型。

从数据源接收的所有数据都转换为绑定中指定的 SSAS 类型(通常在处理期间)。 如果无法执行转换(例如字符串到 Int),则会引发错误。 SQL Server Data Tools (SSDT)通常将绑定中的数据类型设置为与数据源中的源类型最匹配的数据类型。 例如,SQL 类型 Date、DateTime、SmallDateTime、DateTime2、DateTimeOffset 映射到 SSAS Date,SQL 类型时间映射到字符串。

维度的绑定

维度的每个属性都绑定到 DSV 中的列。 维度的所有属性都必须来自单个数据源。 但是,属性可以绑定到不同表中的列。 表之间的关系在 DSV 中定义。 如果同一个表存在多个关系集,则可能需要在 DSV 中引入命名查询以充当“别名”表。 表达式和筛选器通过使用命名计算和命名查询在 DSV 中定义。

度量组、度量值和分区的绑定

每个度量值组具有以下默认绑定:

  • 度量值组绑定到 DSV 中的表(例如)。 MeasureGroup.Source

  • 每个度量值都绑定到该表中的列(例如, Measure.ValueColumn.Source)。

  • 每个度量值组维度都有一组 粒度属性 ,用于定义度量值组的粒度。 每个属性都必须绑定到包含属性键的事实数据表中的列或列。 (有关粒度属性的详细信息,请参阅本主题后面的 MeasureGroup 粒度属性。

可以根据每个分区选择性地覆盖这些默认绑定。 每个分区可以指定不同的数据源、表或查询名称或筛选器表达式。 最常见的分区策略是使用相同的数据源来替代每个分区的表。 替代方法包括为每个分区应用不同的筛选器或更改数据源。

必须在 DSV 中定义默认数据源,从而提供架构信息,包括关系的详细信息。 在分区级别指定的任何其他表或查询都不需要在 DSV 中列出,但它们必须具有与为度量值组定义的默认表相同的架构,或者至少它们必须包含度量值或粒度属性使用的所有列。 每个度量值和粒度属性的详细绑定不能在分区级别重写,并且假定它们与为度量值组定义的列相同。 因此,如果分区使用实际上具有不同架构的数据源, TableDefinition 则为分区定义的查询必须生成与度量值组使用的架构相同的架构。

度量组粒度属性

如果度量值组的粒度与数据库中已知的粒度匹配,并且事实数据表与维度表有直接关系,则粒度属性只需绑定到事实数据表上的相应外键列或列。 例如,请考虑以下事实表和维度表:

Sales(RequestedDate, OrderedProductID, ReplacementProductID, Qty)

Product(ProductID, ProductName,Category)

``

Relation: Sales.OrderedProductID -> Product.ProductID

Relation: Sales.ReplacementProductID -> Product.ProductID

``

如果按已订购产品进行分析,对于“销售上的已订购产品”维度角色,“产品粒度”属性将绑定到 Sales.OrderedProductID。

然而,有时GranularityAttributes可能不会作为事实数据表的列存在。 例如,在以下情况下,GranularityAttributes 可能并不存在作为列:

  • OLAP 粒度比源中的粒度更粗糙。

  • 事实表与维度表之间插入一个中间表。

  • 维度键与维度表中的主键不同。

在所有此类情况下,必须定义 DSV,以便 GranularityAttributes 存在于事实数据表上。 例如,可以引入命名查询或计算列。

例如,在与上述相同的示例表中,如果粒度按类别,则可以引入销售视图。

SalesWithCategory(RequestedDate, OrderedProductID, ReplacementProductID, Qty, OrderedProductCategory)

SELECT Sales.*, Product.Category AS OrderedProductCategory

FROM Sales INNER JOIN Product

ON Sales.OrderedProductID = Product.ProductID

``

在这种情况下,GranularityAttribute Category 绑定到 SalesWithCategory.OrderedProductCategory。

从决策支持对象迁移

决策支持对象 (DSO) 8.0 允许 PartitionMeasures 反弹。 因此,在这些情况下,迁移策略是构造适当的查询。

同样,无法重新绑定分区中的维度属性,尽管 DSO 8.0 也允许重新绑定。 在这些情况下,迁移策略是在 DSV 中定义必要的命名查询,以确保分区的 DSV 中表和列与用于维度的表和列一致。 这些情况可能需要采用简单的迁移,其中 From/Join/Filter 子句映射到单个命名查询,而不是映射到结构化的相关表集。 由于 DSO 8.0 允许重新绑定 PartitionDimensions,即使分区使用相同的数据源,迁移时也可能需要对同一数据源使用多个 DSV。

在 DSO 8.0 中,通过绑定到维度表的主键或事实数据表上的外键,可以采用两种不同的方式表示相应的绑定,具体取决于是否采用优化架构。 在 ASSL 中,两种不同的形式不区分。

即使使用不包含维度表的数据源进行分区,绑定仍然应用于事实数据表中的外键列,而不是维度表中的主键列。

挖掘模型的绑定

挖掘模型是关系模型或 OLAP。 关系挖掘模型的数据绑定与 OLAP 挖掘模型的绑定大相径庭。

关系挖掘模型的绑定

关系挖掘模型依赖于 DSV 中定义的关系来解析与哪些列绑定到哪些数据源的任何歧义性。 在关系挖掘模型中,数据绑定遵循以下规则:

  • 每个非嵌套表列都绑定到案例表上的列,或绑定到与案例表相关的表(遵循多对一或一对一关系)。 DSV 定义表之间的关系。

  • 每个嵌套表列都绑定到源表。 然后,嵌套表列所拥有的列会与源表或与源表相关的其他表中的列建立绑定关系。 (同样,绑定遵循多对一或一对一关系。)挖掘模型绑定不提供嵌套表的连接路径。 相反,DSV 中定义的关系提供此信息。

OLAP 挖掘模型的绑定

OLAP 挖掘模型没有 DSV 的等效项。 因此,数据绑定必须在数据源和列之间解决任何歧义。 例如,挖掘模型可以基于销售多维数据集,列可以基于数量、金额和产品名称。 或者,挖掘模型可以基于产品,并且列可以基于产品名称、产品颜色,以及一个包含销售数量的嵌套表。

在 OLAP 挖掘模型中,数据绑定遵循以下规则:

  • 每个非嵌套表列都绑定到多维数据集上的度量值、多维数据集的维度属性(在维度角色的情况下指定 CubeDimension 以消除歧义),或绑定到维度的属性。

  • 每个嵌套表的列都与一个CubeDimension绑定。 也就是说,它定义如何从维度导航到相关多维数据集或(在嵌套表不太常见的情况下)从多维数据集导航到其中一个维度。

行外绑定

使用在线外绑定,您可以在执行命令期间临时更改现有的数据绑定。 行外绑定是指包含在命令中的绑定,并且不会持久保存。 仅当执行该特定命令时,才应用行外绑定。 相比之下,内联绑定包含在 ASSL 对象定义中,并在服务器元数据中保留对象定义。

ASSL 允许在Process命令(如果命令不在批处理中)或Batch命令上指定行外绑定。 如果在命令上 Batch 指定了行外绑定,则 Batch 命令中指定的所有绑定都会创建一个新的绑定上下文,在该上下文中运行批处理的所有 Process 命令。 此新绑定上下文包括由于 Process 命令而间接处理的对象。

在命令上指定行外绑定时,它们将覆盖指定对象的持久化 DDL 中包含的内联绑定。 这些已处理的对象可能包括直接在命令中 Process 命名的对象,或者可能包括其他对象,其处理是作为处理的一部分自动启动的。

通过使用处理命令包括可选 Bindings 集合对象来指定行外绑定。 可选 Bindings 集合包含以下元素。

资产 基数 类型 DESCRIPTION
Binding 0-n Binding 提供一组新的绑定。
DataSource 0-1 DataSource 将从可能已经使用的服务器替换DataSource
DataSourceView 0-1 DataSourceView 从...替换DataSourceView

本来会被使用的服务器。

与外联绑定相关的所有元素都是可选的。 对于未指定的任何元素,ASSL 使用持久化对象的 DDL 中包含的规范。 在Process命令中指定DataSourceDataSourceView是可选的。 如果指定了 DataSourceDataSourceView,它们将不会被实例化,并且在 Process 命令完成后也不会保留。

脱线绑定类型的定义

在行外的Bindings集合中,ASSL 允许为多个对象绑定集合,每个都是Binding。 每个 Binding 对象都有一个扩展对象引用,它类似于对象引用,但它也可以引用次要对象(例如维度属性和度量值组属性)。 此对象采用命令中Process元素的典型Object平面形式,但<对象></对象>标记不存在。

为其指定绑定的每个对象都由表单 <对象>ID 的 XML 元素(例如, DimensionID) 标识。 使用表单 <对象>ID 明确标识对象后,可以标识要为其指定绑定的元素,通常 Source为该元素。 需要注意的一个常见情况是,当SourceDataItem上的一个属性时,这也就是属性中的列绑定的情况。 在这种情况下,不指定 DataItem 标记;而只需指定 Source 属性,就好像它直接在要绑定的列上一样。

KeyColumns 通过集合中的 KeyColumns 排序来标识。 在这里,例如,无法仅指定属性的第一个和第三个键列,因为无法指示要跳过第二个键列。 所有键列都必须存在于维度属性的行外绑定中。

Translations虽然它们没有 ID,但按其语言以语义方式标识。 因此,Binding 内部的 Translations 需要包含其语言标识符。

Binding中允许的一个附加元素是ParentColumnID,它在DDL中并不直接存在,而是用于数据挖掘的嵌套表。 在这种情况下,必须识别出嵌套表中需要进行绑定的父列。