自动化测试SSAS表格模型

自动化测试SSAS表格

在实际的SSAS Tabular项目中,您需要运行许多不同的测试方案,以向您的客户证明Tabular模型中的数据是正确的。如果您在适当的数据仓库之上运行表格模型,那么与在运营数据库之上构建语义模型时相比,您的生活会容易一些。但是,在表格模型上运行许多测试用例,然后在数据仓库上运行类似的测试并比较结果仍然是一个非常耗时的过程。因此,您的测试用例总是有两个方面,一方面是可以作为数据仓库的源数据库,另一方面是表格模型。有很多测试系统的方法,您可以在Excel中浏览表格模型,在Excel中连接到数据仓库并创建数据透视表,然后比较来自表格模型的数据和来自数据仓库的数据。但是,您可以在Excel中进行上述测试多少个量度和尺寸?

另一种方法是在表格模型端运行DAX查询。如果您的源数据库是SQL Server数据库,则需要在数据库端运行T-SQL查询,然后匹配双方的结果以证明表格模型中的数据正确。

在这篇文章中,我’d想与您分享一种自动在表格模型上运行的DAX查询的方法。

马上,这将是一篇漫长的文章,因此您可以一边享受阅读,一边煮咖啡或喝杯咖啡。

尽管我不会涉及另一端,源端或数据仓库端,但也值得将该部分自动化,因为您可以节省很多时间。一世’确保可以在SQL Server端开发类似的过程,但是,我暂时不做介绍。我什么 ’在本文中将要解释的只是生成和运行DAX查询并将结果存储在SQL Server中的许多可能方式之一。也许它并不完美,但是,这是一个很好的起点。如果您有更好的主意,最好在此帖子下方的评论部分与我们分享。

要求

  • 的SQL服务器分析服务表格2016年及更高版本(兼容级别1200及更高版本)
  • 的SQL服务器的实例
  • 的SQL服务器管理Studio(SSMS)

它是如何工作的

我什么’我要解释的很简单。我想生成并运行DAX查询并捕获结果。第一步是获取所有度量及其相关维度,然后将所有度量按所有相关维度切分并获得结果。最后,我捕获结果并将其存储在SQL Server临时表中。让’考虑一个简单的场景:

  • 您只有一项措施[互联网销售]‘Internet Sales’ table
  • 的measure is related to just one dimension, “Date” dimension
  • 的“Date” dimension has only four columns, Year, Month, Year-Month and 日期
  • you want to slice [Internet Sales] by Year, Month, Year-Month and 日期

因此,您需要编写四个DAX查询,如下所示:

EVALUATE
SUMMARIZE(
    'Internet Sales'
    , 日期'[Calendar Year]
    , "互联网销售", [Internet Total Sales]
)
EVALUATE
SUMMARIZE(
   'Internet Sales'
   , 'Date'[Month 名称]
   , "互联网销售", [Internet Total Sales]
)
EVALUATE
SUMMARIZE(
    'Internet Sales'
   , 'Date'[Year-Month]
   , "互联网销售", [Internet Total Sales]
)
EVALUATE
SUMMARIZE(
     'Internet Sales'
    , 'Date'[Date]
    , "互联网销售", [Internet Total Sales]
)

很容易不是’是吗?可是等等。如果您有10个与4维相关的度量,而每个维都有10列,该怎么办?听起来很费力’是吗?好吧,在现实世界中,您赢了’不能按照所有相关维度对所有度量进行切片,但是您仍然需要做很多事情。我们要做的是生成并运行DAX查询,并将结果存储在SQL Server中的表中。多么酷啊?

好的,这是这样的…

  • 从SQL Server为SSAS表格实例创建链接服务器
  • 使用表格DMV生成DAX查询
  • 通过表格模型运行查询并在SQL Server临时表中获取/存储结果

为SSAS表格创建链接服务器(OLAP服务)

I’我不会在这方面过多的细节。您可以在Internet上找到很多有关如何为SQL Server中的SSAS实例创建链接服务器的资源。这是您可以从SSMS GUI为SSAS创建内联服务器的方法:

  • 打开SSMS并连接到SQL Server实例
  • 扩大“Server Objects”
  • 右键点击“Linked Servers”
  • 请点击“New 链接服务器…”

Creating 新的链接服务器 in SSMS

  • 在里面“New 链接服务器” window, under “General”窗格中,输入链接服务器的名称
  • 确保选择“用于分析服务的Microsoft OLE DB提供程序”
  • 在“Location” section
  • 在中输入所需的数据库名称“Catalog” section
  • 请点击“Security” pane
  • 请点击“Add”按钮并选择一个“Local Login”从下拉列表中
  • 蜱“Impersonate”
  • 请点击“使用登录名制作’当前的安全上下文” then click OK

SSAS链接服务器

注意:您的安全设置可能与上面的设置不同。

使用表格DMV生成DAX查询

现在我们已经对链接服务器进行了排序,让’使用链接服务器运行一些查询,并确保它’按预期工作。 SSAS链接服务器的查询结构如下:

从openquery选择*[LINKED_SERVER_NAME], 目的地查询语言)

作为一个简单的测试,我运行以下查询,该查询的确将DAX查询传递给Tabular模型以运行和检索结果:

select * 
from openquery([TABULAR2017], 'EVALUATE ''Date''')

上面的查询从‘Date’表从表格模型导入SQL Server。结果显然可以存储在任何普通的SQL表中。

让’仔细查看以上查询:

我们必须使用OPENQUERY来通过链接服务器传递DAX查询,在表格侧运行它并获取结果。 公开查询在第二个参数上接受字符串格式的DAX查询。当我们将表名放在DAX中的单引号中时,我们必须在表名中添加一个额外的单引号,如下面的屏幕快照所示。

通过链接服务器到SSAS表格的Runnind 达克斯查询

在我们继续之前’s看到我们需要什么DAX查询构造以及我们遵循的查询模式。这是如果我们批量运行本文前面提到的所有DAX查询所得到的,是的!使用链接服务器时,我们可以一次运行多个DAX查询,这不足为奇。从SSMS的角度来看,我们只是运行一批SQL语句,’t we?

select * 
from openquery([TABULAR2017]
                , 'EVALUATE 和MARIZE(''Internet Sales''
                                    , ''Date''[Calendar Year]
                                    , "互联网销售", [Internet Total Sales])')

select * 
from openquery([TABULAR2017]
                , 'EVALUATE 和MARIZE(''Internet Sales''
                , ''Date''[Month 名称]
                , "互联网销售", [Internet Total Sales])')

select * 
from openquery([TABULAR2017]
                , 'EVALUATE 和MARIZE(''Internet Sales''
                , ''Date''[Year-Month]
                , "互联网销售", [Internet Total Sales])')

select * 
from openquery([TABULAR2017]
                , 'EVALUATE 和MARIZE(''Internet Sales''
                , ''Date''[Date]
                , "互联网销售", [Internet Total Sales])')

SSMS从SQL Server通过链接服务器为SSAS表格运行多个DAX查询

这是上述查询的通用版本:

从openquery选择*([TABULAR2017], ‘EVALUATE 和MARIZE(”FACT_TABLE”, ”RELATED_DIMENSION”[COLUMN_NAME], MEASURE_GIVEN_NAME,[MEASURE_NAME])’)

如您所见,我们在所有查询中都重复了以下模式:

  • A “SELECT” statement with “OPENQUERY”以及链接的服务器名称
  • 在里面query argument we have “EVALUATE 和MARIZE(“

然后我们有:

  • 两个单引号
  • FACT_TABLE:托管度量的表
  • 两个单引号和一个逗号
  • 另外两个单引号
  • RELATED_DIMENSION:这是一个维度表,与度量相关
  • 再次两个单引号
  • 开括号
  • COLUMN_NAME:维度中用于切片度量的列
  • 右括号
  • 双引号,是的!这个是双qoute
  • MEASURE_GIVEN_NAME:这是我们为度量指定的名称,例如别名
  • 双引号
  • 开括号
  • 右括号
  • 圆括号
  • 最后单引号
  • 最后是另一个括号

到目前为止,我们只是通过链接服务器从SQL Server运行DAX查询,在接下来的几行中,我们将运行DMV以获取生成DAX查询并通过链接服务器从SQL Server运行它们所需的元数据。要使用上述模式生成DAX查询,我们需要以下五个DMV:

  • DISCOVER_CALC_DEPENDENCY
  • TMSCHEMA_TABLES
  • TMSCHEMA_MEASURES
  • TMSCHEMA_COLUMNS
  • TMSCHEMA_RELATIONSHIPS

阅读有关动态管理视图(DMV)的更多信息 这里.

虽然我们不’如果需要DMV中的所有列,我只选择我们需要的列,并且还将一些条件放在where子句中,稍后我将解释使用这些条件的原因。但是现在,我们要进行的查询如下DMV查询所示:

select [Object]
     , [Expression]
     , [Referenced_Table]
from $SYSTEM.DISCOVER_CALC_DEPENDENCY 
where [Object_Type] = 'measure'
select [Name]
     , [ID] 
from $SYSTEM.TMSCHEMA_TABLES 
where not IsHidden
select [TableID]
     , [Name]
     , [Expression] 
from $SYSTEM.TMSCHEMA_MEASURES 
where not IsHidden 
      和[DataType] <> 2
select [TableID]
     , [ExplicitName] 
from $ SYSTEM.TMSCHEMA_COLUMNS 
where not [IsHidden] 
       和[Type] <> 3  
       和not [IsDefaultImage]  
       和[ExplicitDataType] = 2  
       和[State] = 1
select [FromTableID]
     , [ToTableID] 
from $SYSTEM.TMSCHEMA_RELATIONSHIPS 
where IsActive

如您所见,我在上述查询中使用了一些枚举,如下所示:

  • 在 TMSCHEMA_MEASURES,“数据类型” shows the data type of the measure. 的possible values are:
枚举 描述
2
6 在t64
8
9 日期Time
10 小数
11 布尔型
17 二元
19 未知(该措施在 错误 州)
20 变量(具有不同数据类型的度量)

所以加“DataType <> 2”在查询TMSCHEMA_MEASURES时对where子句的引用意味着我们对文本度量不感兴趣,例如当您使用DAX中的USERNAME()函数定义显示用户名的度量时。

  • 在 TMSCHEMA_COLUMNS, 我用了“Type”, “ExplicitDataType” and “State”枚举。上述枚举的可能值为:
名称 枚举 描述
类型 1 数据(来自数据源)
2 计算(计算列)
3 RowNumber(这是不可见的内部列。它表示行号。)
4 CalculatedTableColumn(计算表中的计算列)
显式数据

类型

1 自动(将计算列或计算表列的值设置为自动时,将自动推断类型)
2
6 在t64
8
9 日期Time
10 小数
11 布尔型
17 二元
19 未知(列处于错误状态)
1 就绪(该列是可查询的并且具有最新数据)
3 NoData(该列仍可查询)
4 CalculationNeeded(该列不可查询,需要刷新)
5 SemanticError(由于表达式无效,该列处于错误状态)
6 EvaluationError(由于表达式求值期间发生错误,该列处于Error状态)
7 DependencyError(该列处于错误状态,因为其某些计算依赖项处于错误状态)
8 不完整(列的某些部分没有数据,并且需要刷新该列以将数据引入)
9 SyntaxError(由于表达式中的语法错误,该列处于错误状态)

所以加“Type <>3且ExplicitDataType = 2且State = 1”查询时到where子句“TMSCHEMA_COLUMNS”意味着我们只对不是内部行号的列感兴趣,并且它们的数据类型是字符串,并且可以查询并可以使用。

下一步是将上述查询放入OPENQUERY。最后的查询将类似于以下查询:

select [Object] MeasureName 
     , [Expression] 
     , [Referenced_Table] ReferencedTable 
from openquery([TABULAR2017]
                , 'select [Object] 
                        , [Expression] 
                        , [Referenced_Table]  
                   from $SYSTEM.DISCOVER_CALC_DEPENDENCY  
                   where [Object_Type] = ''measure'''
                 )
select [TableID] 
     , [Name] MeasureName 
     , [Expression] 
from openquery([TABULAR2017]
                ,  'select [TableID] 
                         , [Name] 
                         , [Expression]    
                from $SYSTEM.TMSCHEMA_MEASURES  
                where not [IsHidden]   
                     和[DataType] <> 2'
                )
select [FromTableID]
    , [ToTableID] 
from openquery([TABULAR2017], 'select [FromTableID]
                                    , [ToTableID] 
                                from $SYSTEM.TMSCHEMA_RELATIONSHIPS 
                                where [IsActive]'
                )
select [Name] TableName
    , [ID] 
from openquery([TABULAR2017], 'select [Name]
                                    , [ID] 
                                from $SYSTEM.TMSCHEMA_TABLES 
                                where not IsHidden'
                )
select [TableID] 
    ,  [ExplicitName] 有关Column 
from openquery([TABULAR2017], 'select [TableID]
                                    , [ExplicitName] 
                                from $ SYSTEM.TMSCHEMA_COLUMNS 
                                where not [IsHidden] 
                                       和[Type] <> 3 
                                       和not [IsDefaultImage] 
                                       和[ExplicitDataType] = 2 
                                       和[State] = 1'
                )

现在我们要加入以上表格以获得:

  • 可见的措施
  • 的base tables used in measures (referenced tables)
  • 措施的相关范围
  • 这些相关维度的列

通过具有以上四个元素,我们可以通过连接以上五个查询来动态生成所需的DAX查询。我使用CTE构造来加入以上查询:

;with 
    MeasureReferences as (
        select [Object] MeasureName
            , [Expression]
            , [Referenced_Table] ReferencedTable 
        from openquery([TABULAR2017], 'select [Object]
                                            , [Expression]
                                            , [Referenced_Table] 
                                        from $SYSTEM.DISCOVER_CALC_DEPENDENCY 
                                        where [Object_Type] = ''measure'' '
                         ) 
        ) 
    , 措施 as (
        select [TableID]
            , [Name] MeasureName
            , [Expression] 
        from openquery([TABULAR2017], 'select [TableID]
                                            , [Name]
                                            , [Expression] 
                                        from $SYSTEM.TMSCHEMA_MEASURES 
                                        where not [IsHidden] and [DataType] <> 2'
                        )
        where  charindex('SUM', ltrim(rtrim(cast([Expression] as varchar(max))))) = 1
        )
    , Relationships as (
        select [FromTableID]
            , [ToTableID] 
        from openquery([TABULAR2017], 'select [FromTableID]
                                            , [ToTableID] 
                                       from $SYSTEM.TMSCHEMA_RELATIONSHIPS 
                                       where [IsActive]'
                       ) 
        )
    , Tables as (
        select [Name] TableName
            , [ID] 
        from openquery([TABULAR2017], 'select [Name]
                                            , [ID] 
                                        from $SYSTEM.TMSCHEMA_TABLES 
                                        where not IsHidden'
                        )
        ) 
    , Columns as (
        select [TableID] 
            ,  [ExplicitName] 有关Column 
        from openquery([TABULAR2017], 'select [TableID]
                                            , [ExplicitName] 
                                       from $ SYSTEM.TMSCHEMA_COLUMNS 
                                       where not [IsHidden] 
                                            和[Type] <> 3 
                                            和not [IsDefaultImage] 
                                            和[ExplicitDataType] = 2 
                                            和[State] = 1'
                        )
        )

select cast(mr.ReferencedTable as varchar(max)) TableName
     , cast(m.MeasureName as varchar(max)) MeasureName
     , cast((select TableName 
                 from Tables 
                 where [ID] = r.[ToTableID]
                 ) as varchar(max)
               ) 有关Dimension
     , cast(c.RelatedColumn as varchar(max)) 有关Column
from 措施 m 
    join MeasureReferences mr on cast(mr.MeasureName as varchar(max)) = cast(m.MeasureName as varchar(max))
    join Relationships r on (select ID 
                                 from Tables 
                                 where cast(mr.ReferencedTable as varchar(max)) = cast(TableName as varchar(max))
                                 ) = r.[FromTableID]
    join Columns c on c.[TableID] = r.[ToTableID]

使用链接服务器在SQL Server中加入DMV

让’s重新访问我们将使用上述查询结果生成的DAX查询。

EVALUATE 
SUMMARIZE(
       'Internet Sales'
     , 'Date'[Calendar Year]
     , "互联网销售", [Internet Total Sales]
)

如果运行上面的查询,我们将得到:

在SSMS中运行DAX查询

看起来不错,但是,当我们生成DAX查询时,我们将自动检测所有度量的所有相关维度并生成查询,以便它按相关维度的每一列对每个度量进行切片。在这种情况下,我们对运行的每个查询的列名将不同于上面的屏幕快照中看到的列名。

在SSMS中批量运行SSAS DMV

因此,我们必须对不理想的列名称进行硬编码。另外,我们将把这些数据插入SQL Server表中。使用硬编码的列名,则在左列中将有一些无意义的维值,在右列中将有一些度量值。因此,我们必须稍微更改上面的查询,以便它动态地使用列名作为另外两个列的值。因此,查询的结果有4列,第一列(从左起)包含列名以及在第二列旁边的值。第三列显示度量名称,第四列显示度量值。

在SSMS中运行DAX查询 with 选择COLUMNS

看起来好多了。我运行以下DAX查询以获取以上结果:

EVALUATE
SELECTCOLUMNS (
    SUMMARIZE (
        'Internet Sales'
        , 'Date'[Calendar Year]
        , "Measure 名称", "互联网销售"
        , "Value", [Internet Total Sales]
    ),
    "Dimension 名称", "'Date'[Calendar Year]"
    , "Dimension Value", 'Date'[Calendar Year]
    , "Measure 名称", "在ternet Total Sales"
    , "Measure Value", [Internet Total Sales]
)

下一步是使用通过链接服务器运行的DMV的结果动态生成后一个DAX查询。

在以下查询中,我们定义一个局部变量来生成DAX查询,然后使用“Print”查看T-SQL函数的结果。

注意: 的“Print”函数在显示大字符串方面有局限性,因此我们仅会显示一部分结果。 进一步了解“Print” 这里.

declare @SQL varchar(max) = null

;with 
    MeasureReferences as (
        select [Object] MeasureName
            , [Expression]
            , [Referenced_Table] ReferencedTable 
        from openquery([TABULAR2017], 'select [Object]
                                            , [Expression]
                                            , [Referenced_Table] 
                                        from $SYSTEM.DISCOVER_CALC_DEPENDENCY 
                                        where [Object_Type] = ''measure'' '
                         ) 
        ) 
    , 措施 as (
        select [TableID]
            , [Name] MeasureName
            , [Expression] 
        from openquery([TABULAR2017], 'select [TableID]
                                            , [Name]
                                            , [Expression] 
                                        from $SYSTEM.TMSCHEMA_MEASURES 
                                        where not [IsHidden] and [DataType] <> 2'
                        )
        where  charindex('SUM', ltrim(rtrim(cast([Expression] as varchar(max))))) = 1
        )
    , Relationships as (
        select [FromTableID]
            , [ToTableID] 
        from openquery([TABULAR2017], 'select [FromTableID]
                                            , [ToTableID] 
                                       from $SYSTEM.TMSCHEMA_RELATIONSHIPS 
                                       where [IsActive]'
                       ) 
        )
    , Tables as (
        select [Name] TableName
            , [ID] 
        from openquery([TABULAR2017], 'select [Name]
                                            , [ID] 
                                        from $SYSTEM.TMSCHEMA_TABLES 
                                        where not IsHidden'
                        )
        ) 
    , Columns as (
        select [TableID] 
            ,  [ExplicitName] 有关Column 
        from openquery([TABULAR2017], 'select [TableID]
                                            , [ExplicitName] 
                                       from $ SYSTEM.TMSCHEMA_COLUMNS 
                                       where not [IsHidden] 
                                            和[Type] <> 3 
                                            和not [IsDefaultImage] 
                                            和[ExplicitDataType] = 2 
                                            和[State] = 1'
                        )
        )

select @SQL = ISNULL(@SQL, '') + '从openquery选择* ([TABULAR2017], ''EVALUATE 选择COLUMNS(SUMMARIZE ('''''+[TableName]+''''', '''''+RelatedDimension+'''''['+RelatedColumn+'], "Measure 名称", "'+MeasureName+'", "Value", ['+MeasureName+']) , "Dimension 名称", "'''''+RelatedDimension+'''''['+RelatedColumn+']", "Dimension Value", '''''+RelatedDimension+'''''['+RelatedColumn+'], "Measure 名称",  "'+MeasureName+'", "Measure Value",  ['+MeasureName+'])'')
'
from (
select cast(mr.ReferencedTable as varchar(max)) TableName
     , cast(m.MeasureName as varchar(max)) MeasureName
     , cast((select TableName 
             from Tables 
             where [ID] = r.[ToTableID]
             ) as varchar(max)
            ) 有关Dimension
     , cast(c.RelatedColumn as varchar(max)) 有关Column
from 措施 m 
    join MeasureReferences mr on cast(mr.MeasureName as varchar(max)) = cast(m.MeasureName as varchar(max))
    join Relationships r on (select ID 
                             from Tables 
                             where cast(mr.ReferencedTable as varchar(max)) = cast(TableName as varchar(max))
                             ) = r.[FromTableID]
    join Columns c on c.[TableID] = r.[ToTableID]
    ) as tbl

Print @SQL

使用DMV动态生成DAX

您可以复制/粘贴并运行生成的每个查询以获取结果。

我手动运行了从结果中复制的以下查询:

从openquery选择* ([TABULAR2017], 'EVALUATE 选择COLUMNS(SUMMARIZE (''Internet Sales'', ''Currency''[Currency Code], "Measure 名称", "在ternet Total Sales", "Value", [Internet Total Sales]) , "Dimension 名称", "''Currency''[Currency Code]", "Dimension Value", ''Currency''[Currency Code], "Measure 名称", "在ternet Total Sales", "Measure Value", [Internet Total Sales])')

在SSMS中手动运行生成的DAX

的last step is to execute all generated queries and store the results in a 的SQL服务器 Table.

通过链接服务器运行生成的DAX查询并将结果存储在SQL Server中

这是个简单的。我们只需要执行存储在@SQL局部变量中的动态SQL,然后将结果存储在我们在SQL Server中创建的表中即可。为了这篇文章,我在SQL Server中创建一个全局临时表。因此,最终查询将如下所示:

if object_id('tempdb..##Results') is not null drop table ##Results
create table ##Results (DimensionName varchar(max)
                     , DimensionValue varchar(max)
                     , MeasureName varchar(max)
                     , MeasureValue bigint
                     ) --Create a global temp table
declare @SQL varchar(max) = null

;with --Get measures, their related dimensions and dimenion columns
    MeasureReferences as (
        select [Object] MeasureName
            , [Expression]
            , [Referenced_Table] ReferencedTable 
        from openquery([TABULAR2017], 'select [Object]
                                            , [Expression]
                                            , [Referenced_Table] 
                                        from $SYSTEM.DISCOVER_CALC_DEPENDENCY 
                                        where [Object_Type] = ''measure'' '
                         ) 
        ) 
    , 措施 as (
        select [TableID]
            , [Name] MeasureName
            , [Expression] 
        from openquery([TABULAR2017], 'select [TableID]
                                            , [Name]
                                            , [Expression] 
                                        from $SYSTEM.TMSCHEMA_MEASURES 
                                        where not [IsHidden] and [DataType] <> 2'
                        )
        where  charindex('SUM', ltrim(rtrim(cast([Expression] as varchar(max))))) = 1
        )
    , Relationships as (
        select [FromTableID]
            , [ToTableID] 
        from openquery([TABULAR2017], 'select [FromTableID]
                                            , [ToTableID] 
                                       from $SYSTEM.TMSCHEMA_RELATIONSHIPS 
                                       where [IsActive]'
                       ) 
        )
    , Tables as (
        select [Name] TableName
            , [ID] 
        from openquery([TABULAR2017], 'select [Name]
                                            , [ID] 
                                        from $SYSTEM.TMSCHEMA_TABLES 
                                        where not IsHidden'
                        )
        ) 
    , Columns as (
        select [TableID] 
            ,  [ExplicitName] 有关Column 
        from openquery([TABULAR2017], 'select [TableID]
                                            , [ExplicitName] 
                                       from $ SYSTEM.TMSCHEMA_COLUMNS 
                                       where not [IsHidden] 
                                            和[Type] <> 3 
                                            和not [IsDefaultImage] 
                                            和[ExplicitDataType] = 2 
                                            和[State] = 1'
                        )
        )

select @SQL = ISNULL(@SQL, '') + '从openquery选择* ([TABULAR2017], ''EVALUATE 选择COLUMNS(SUMMARIZE ('''''+[TableName]+''''', '''''+RelatedDimension+'''''['+RelatedColumn+'], "Measure 名称", "'+MeasureName+'", "Value", ['+MeasureName+']) , "Dimension 名称", "'''''+RelatedDimension+'''''['+RelatedColumn+']", "Dimension Value", '''''+RelatedDimension+'''''['+RelatedColumn+'], "Measure 名称",  "'+MeasureName+'", "Measure Value",  ['+MeasureName+'])'')
'
from (
select cast(mr.ReferencedTable as varchar(max)) TableName
     , cast(m.MeasureName as varchar(max)) MeasureName
     , cast((select TableName 
             from Tables 
             where [ID] = r.[ToTableID]
              ) as varchar(max)
            ) 有关Dimension
     , cast(c.RelatedColumn as varchar(max)) 有关Column
from 措施 m 
    join MeasureReferences mr on cast(mr.MeasureName as varchar(max)) = cast(m.MeasureName as varchar(max))
    join Relationships r on (select ID 
                             from Tables 
                             where cast(mr.ReferencedTable as varchar(max)) = cast(TableName as varchar(max))
                             ) = r.[FromTableID]
    join Columns c on c.[TableID] = r.[ToTableID]
    ) as tbl --Generate 达克斯 queries dynamically
insert into ##Results
execute (@SQL) --Execute the 达克斯 queries

select DimensionName, DimensionValue, MeasureName, FORMAT(MeasureValue, '#,#.#') MeasureValue
from ##Results
where MeasureValue <> 0 and MeasureValue is not null

注意事项

如果您正确设置了链接服务器,则以上查询应适用于任何表格模型。但是,您可能会注意到,它将针对切片度量与来自所有相关维度的所有列的所有可能组合生成大量查询。查询将一个接一个地针对SSAS Tabular实例运行。因此,如果您有很多度量和尺寸,那么可以肯定’会遇到性能问题。不幸的是,在实际项目中就是这种情况。但是,您可以做的是选择一些对业务最重要的最大维度,并将上述查询限制为仅产生某些可能性。另一点是,在很多情况下,您确实不愿意’需要测试度量的所有组合以及相关维度的所有列。因此,您可以向查询添加更多条件,以根据需要生成更少的查询。例如,在上面的查询中,查看“Measures”CTE。我设置了条件以仅获取其表达式开头的量度“SUM”。这样做的原因是,我只想获得基本上是总和基础量度的量度。在现实世界的项目中,您可能有数百种度量,并且在没有任何条件的情况下运行上述查询不会’t sound quite right.

可能的问题

问:查询特定于SSAS表格模型吗?

答:是的。但是,您可以对SSAS多维执行类似的操作。

问:此方法是否取决于表格服务器名称和/或数据库名称?

答:只要正确设置了链接服务器,就不会有任何问题。

问:我们可以使用这种方法来测试Power BI模型吗?

答:是的。您只需要打开Power BI Desktop(pbix)文件并找到其本地端口号即可。然后,您可以创建一个链接服务器到Power BI文件,然后’很高兴去。进一步了解 在此处查找Power BI Desktop本地端口号.

问:这种方法只是获取量度及其相关尺寸的方法’SSAS表格侧的列。最后,我们必须将结果与基础数据源(如数据仓库)进行比较。我们应该如何针对源系统进行测试。

答:如前所述,我们仅涵盖SSAS表格侧。您可以在数据仓库端执行类似的操作并比较结果。挑战之一将是找到数据仓库与SSAS表格模型之间的列映射。有一个“SourceColumn” available in the “$ SYSTEM.TMSCHEMA_COLUMNS”DMV获取源列名称。那可能是一个很好的起点。然后,您可以使用动态SQL生成查询并针对您的数据仓库运行,将结果存储在SQL Server表中。其余的将很容易比较两个结果。

问:此方法是否也适用于Azure分析服务?

答:是的。

One thought on “自动化测试SSAS表格模型

  1. 我听了你的指导,给了我大量的大脑食物。主席先生,从我的角度来看,这是出色的指南,是自动SSAS多维数据集测试的先驱!感谢那。

有什么想法吗?在这里与我们分享:

该网站使用Akismet减少垃圾邮件。 了解如何处理您的评论数据.