在 Excel 中使用 VBA,如何获取服务器上所有 OLAP Cube 的名称?

Posted

技术标签:

【中文标题】在 Excel 中使用 VBA,如何获取服务器上所有 OLAP Cube 的名称?【英文标题】:Using VBA in Excel, how do I get the names of all OLAP Cubes on a server? 【发布时间】:2015-03-04 20:27:59 【问题描述】:

公司为我们的每个客户创建一个 OLAP 多维数据集数据库。我使用多维数据集中的值来跟上许多事情。每当设置新客户的多维数据集时,我都会在我使用的工作簿中添加一个工作表,并使用该多维数据集创建一个数据透视表。

我想检查服务器是否有任何可能已添加的多维数据集。

我认为这样的方法是最好的方法。

For Each Cube in Server.Cubes
    MsgBox Cube.Name
Next Cube

我找不到任何类似的东西。我搜索了几天的答案。有什么方法可以通过服务器解析查看可用的多维数据集?

【问题讨论】:

【参考方案1】:

SSAS 服务器有DMVs,您可以查询它以确定服务器上的多维数据集数。然后您可以使用 VBA 将其与之前表中的行数进行比较。关注these instructions进行连接,或见下文。

    在 Excel 中创建新连接:在“获取外部数据”部分中,选择“来自其他源”->“SQL Server(不是 Analysis Services)”。 输入您可以连接的任何 SQL Server 的连接信息(我们将在后面的步骤中更改此信息)。 选择您有权访问的任何数据库和表。浏览向导并在最后选择仅保存连接。 单击连接。找到您的连接并单击“属性”按钮。

    在“定义”选项卡上,将连接字符串更新为如下所示

    Provider=MSOLAP.5;Integrated Security=SSPI;Persist Security Info=True;Initial Catalog=SSASDB;Data Source=MyServer\MyInstance;MDX Compatibility=1;Safety Options=2;MDX Missing Member Mode=Error
    

    将命令类型更改为默认

    将命令文本更改为以下内容:

    SELECT 
    [CATALOG_NAME] AS SSAS_Database_Name,
    [CUBE_NAME] AS Cube_or_Perspective_Name,
    [CUBE_CAPTION] AS Cube_or_Perspective_Caption,
    [CUBE_TYPE] AS Cube_Type,
    [BASE_CUBE_NAME] AS Base_Cube
    FROM 
    $SYSTEM.MDSCHEMA_CUBES
    WHERE
    CUBE_SOURCE=1
    AND
    [BASE_CUBE_NAME] < ''
    

    单击“确定”,然后单击“关闭”。

    单击现有连接。选择您的连接。

    在导入数据窗口中选择表。选择将您的表格放在新的工作表上。

    您的表格应该在 A 到 E 列中。在单元格 G2 中输入 Prior Row Count:

    在单元格 G3 中输入Current Row Count:

    在单元格 H2 中放入 0。

    在单元格 H3 中,输入以下公式:

    =COUNTA(Table_ExternalData_1[SSAS_Database_Name])
    

    编写一个宏,将单元格 H3 中的值复制到 H2,然后刷新表的数据连接。我的看起来像这样:

    Sub UpdateCubeCount()
        Range("H3").Select
        Selection.Copy
        Range("H2").Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
        Range("B2").Select
        Application.CutCopyMode = False
        Selection.ListObject.QueryTable.Refresh BackgroundQuery:=False
    End Sub
    

    作为奖励,将条件格式添加到单元格 H3。将其格式化为规则单元格值 > $H$2 的粉红色背景和红色文本。

你最终会得到如下所示的东西:

更新:如果您正在寻找 SSAS 数据库而不是多维数据集本身,您可以使用此查询而不是第 7 步中的查询:

SELECT [catalog_name] AS SSAS_Database_Name, [date_modified] 
FROM $system.DBSCHEMA_CATALOGS

如果您可以假设每个数据库只有一个多维数据集,这将非常有用,这很常见。

【讨论】:

非常感谢您的回复。我使用上面的方法设置了一个表,但这不是我想要的。每当我说“Cube”时,我可能使用了错误的术语。每个客户端拥有的“立方体”都显示在 SSAS_Database_Name 列中,因此它只显示我选择的那个。如何让此列表显示 A 列中所有服务器可用的“目录”或 SSAS 数据库?这就是我需要的。 好的,我在最后提出了一个对你有帮助的问题。 哇,做到了。我们的数据库管理员说这不是一件容易的事。我迫不及待地想给他看这个。非常感谢! 上面的这个方法效果很好。我现在在许多不同的应用程序中使用它。使用同样的方法,有没有办法拉出立方体内所有维度和度量的列表? 是的,有用于度量 ($SYSTEM.MDSCHEMA_MEASURES) 和维度 ($SYSTEM.MDSCHEMA_DIMENSIONS) 的 DMV。我的答案中的link 有对它们的查询。您可以查询数据库中的特定多维数据集或所有多维数据集。

以上是关于在 Excel 中使用 VBA,如何获取服务器上所有 OLAP Cube 的名称?的主要内容,如果未能解决你的问题,请参考以下文章

excel vba中如何获取筛选数据的正确行号

如何在excel VBA中获取保存文件的路径和名称?

Excel 在 VBA 中,如何获取 Function 的返回值

VBA - 如何在 Excel 2010 的目录中获取最后修改的文件或文件夹

在 Excel 中运行 VBA 代码以获取 Access 数据库中的 VBA

在excel的VBA里如何获取日期和星期几