Working with Dimensions and Levels

Note

  This feature will be removed in the next version of Microsoft SQL Server. Do not use this feature in new development work, and modify applications that currently use this feature as soon as possible.

The dimensions of a cube store data derived from relational database tables and contain the categorical data you want to analyze.

The dimensions you build should be distinct categories that you want to add to cubes in your database (such as Time, Customer Education, and Customer Age). A dimension can be created from a single dimension table (star schema) or from multiple dimension tables (snowflake schema). Dimensions are classified as either standard or time dimensions, depending upon the data type of the corresponding column in the dimension table.

Collections of dimensions are contained within objects of ClassType clsDatabase, clsCube, clsPartition, and clsAggregation. The dimension objects contained within each of these collections are of respective ClassTypes clsDatabaseDimension, clsCubeDimension, clsPartitionDimension, and clsAggregationDimension.

The List Dimensions example lists existing dimensions and their related levels. The Add Dimensions example creates new dimensions and levels.

List Dimensions

The Dimensions collection of the DSO.Server object contains all shared dimensions on an Analysis server, as illustrated by the following code example.

The following code example illustrates the hierarchical nature of dimensions and levels by listing the levels in order of precedence for every dimension contained in every database on a given Analysis server, printing basic properties of each dimension and level in the Immediate window:

Private Sub ListDimensions()
    Dim dsoServer As New DSO.Server
    Dim dsoDB As DSO.MDStore
    Dim dsoDim As DSO.Dimension
    Dim dsoLev As DSO.Level

    ' Create a connection to the Analysis server.
    dsoServer.Connect "LocalHost"

    ' Enumerate databases on a server.
    For Each dsoDB In dsoServer.MDStores
        Debug.Print "DATABASE: " & dsoDB.Name & " - " & _
            dsoDB.Description

        ' Enumerate dimensions in a database.
        For Each dsoDim In dsoDB.Dimensions
            Debug.Print "    Dimension: " & dsoDim.Name

            ' Enumerate levels in a dimension.
            For Each dsoLev In dsoDim.Levels
                Debug.Print "        Level: " & dsoLev.Name
            Next
        Next
    Next

End Sub

Add Dimensions and Levels

To add a dimension, the AddNew method of the Dimensions collection for an MDStore database object is used. After a new dimension has been created in this way, levels are added using the AddNew method of the Levels collection for the new Dimension object.

The following code example adds the Products dimension with two levels, Brand Name and Product Name, and the Stores dimension with four levels, Store Country, Store State, Store City and Store ID, to the TestDB database. In addition, the Store ID level has a member property named Store SQFT associated with it. The following diagram graphically displays the relationships.

For more information about member properties, see clsMemberProperty.

Note

  The TestDB database is created using some of the prior examples in this topic. For more information, see Working with Databases.

The following code example adds two new dimensions to the TestDB database:

Private Sub AddDimensions()
    Dim dsoServer As New DSO.Server
    Dim dsoDB As DSO.MDStore
    Dim dsoDS As DSO.DataSource
    Dim dsoDim As DSO.Dimension
    Dim dsoLev As DSO.Level
    Dim dsoMember As DSO.MemberProperty

    Dim strDBName As String

    ' Constants used for ColumnType property
    ' of the DSO.Level object.
    ' Note that these constants are identical to
    ' those used in ADO in the DataTypeEnum enumeration.
    Const adWChar = 130
    Const adInteger = 3
    Const adDouble = 5

    ' Initialize variables for the database name.
    strDBName = "TestDB"

    ' Create a connection to the Analysis server.
    dsoServer.Connect "LocalHost"

    ' Set the database object.
    Set dsoDB = dsoServer.MDStores(strDBName)

    ' Set the data source for the database object.
    ' A data source is required to run this example.
    If dsoDB.DataSources.Count = 0 Then
        MsgBox "Database " & dsoDB.Name & _
            " has no data sources."
    Else
        Set dsoDS = dsoDB.DataSources(1)
    End If

    ' Create Products dimension and levels.
    Set dsoDim = dsoDB.Dimensions.AddNew("Products")
    Set dsoDim.DataSource = dsoDS   ' Dimension data source
    dsoDim.FromClause = "product"   ' Related table
    dsoDim.JoinClause = ""          ' Used in snowflake schema

    ' Add Brand Name level.
    Set dsoLev = dsoDim.Levels.AddNew("Brand Name")
    dsoLev.MemberKeyColumn = """product"".""brand_name"""
    dsoLev.ColumnSize = 255         ' Column data size in bytes
    dsoLev.ColumnType = adWChar     ' Column data type
    dsoLev.EstimatedSize = 1        ' Distinct members in column

    ' Add Product Name level.
    Set dsoLev = dsoDim.Levels.AddNew("Product Name")
    dsoLev.MemberKeyColumn = """product"".""product_name"""
    dsoLev.ColumnSize = 255
    dsoLev.ColumnType = adWChar
    dsoLev.EstimatedSize = 1

    ' Update the Products dimension.
    dsoDim.Update

    ' Inform the user.
    MsgBox "Dimension " & dsoDim.Name & " added to " & _
        dsoDim.DataSource.Name & " data source."

    ' Create Stores dimension and levels.
    Set dsoDim = dsoDB.Dimensions.AddNew("Stores")
    Set dsoDim.DataSource = dsoDS   ' Dimension data source
    dsoDim.FromClause = "store"     ' Related table
    dsoDim.JoinClause = ""          ' Used in snowflake schema

    ' Add Store Country level.
    Set dsoLev = dsoDim.Levels.AddNew("Store Country")
    dsoLev.MemberKeyColumn = """store"".""store_country"""
    dsoLev.ColumnSize = 50          ' Column data size in bytes
    dsoLev.ColumnType = adWChar     ' Column data type
    dsoLev.EstimatedSize = 1        ' Distinct members in column

    ' Add Store State level.
    Set dsoLev = dsoDim.Levels.AddNew("Store State")
    dsoLev.MemberKeyColumn = """store"".""store_state"""
    dsoLev.ColumnSize = 50
    dsoLev.ColumnType = adWChar
    dsoLev.EstimatedSize = 1

    ' Add Store City level.
    Set dsoLev = dsoDim.Levels.AddNew("Store City")
    dsoLev.MemberKeyColumn = """store"".""store_city"""
    dsoLev.ColumnSize = 50
    dsoLev.ColumnType = adWChar
    dsoLev.EstimatedSize = 1

    ' Add Store ID level.
    Set dsoLev = dsoDim.Levels.AddNew("Store ID")
    dsoLev.MemberKeyColumn = """store"".""store_ID"""
    dsoLev.ColumnSize = 4
    dsoLev.ColumnType = adInteger
    dsoLev.EstimatedSize = 1

    ' Add a member property to the Store ID level.
    Set dsoMember = dsoLev.MemberProperties.AddNew("Store SQFT", _
        sbclsRegular)
    dsoMember.Description = "Store size in square feet"
    dsoMember.SourceColumn = """store"".""store_sqft"""
    dsoMember.ColumnSize = 4
    dsoMember.ColumnType = adDouble

    ' Update the Stores dimension.
    dsoDim.Update

    ' Inform the user.
    MsgBox "Dimension " & dsoDim.Name & " added to " & _
        dsoDim.DataSource.Name & " data source."

End Sub

See Also

Reference

Concepts