SQL Server SSAS多维模型不规则父子维度过滤查询异常求助
解决方案:SSAS不规则父子层级MDX查询内部异常问题
针对你遇到的SSAS多维模型中不规则父子层级(ragged parent-child hierarchy)在特定筛选条件下MDX查询抛出内部异常的问题,结合你的排查结果,我整理了几个可行的修复方案:
方案1:调整父子层级的成员隐藏设置(Visual Studio项目端修复)
这个是从维度设计层面解决问题的核心方案,异常根源大概率是不规则层级中存在父节点不在筛选范围内的成员,导致SSAS在解析MEMBER_CAPTION时逻辑冲突:
- 在Visual Studio中打开你的SSAS项目,进入Company维度的设计器;
- 找到
Company Hierarchy这个父子层级,右键选择属性; - 在属性面板中找到
Hide Member If选项,设置为以下两者之一:Parent is Hidden:当成员的父节点被隐藏时,自动隐藏该成员;No name:隐藏没有名称的成员(如果你的德国地区数据存在空名称的公司);
- 保存项目,重新处理维度和对应的立方体,然后再执行MDX查询测试。
方案2:修改MDX语句,增强成员属性获取的健壮性
如果暂时无法修改维度设计,可以通过调整MDX代码避免触发异常。问题出在CURRENTMEMBER.MEMBER_CAPTION的获取上,我们可以增加有效性检查:
WITH MEMBER [Measures].[ParameterCaption] AS IIF( [Company].[Company Name].CURRENTMEMBER IS NULL OR [Company].[Company Name].CURRENTMEMBER.LEVEL IS NULL, '', -- 为空或无效成员设置默认值 [Company].[Company Name].CURRENTMEMBER.MEMBER_CAPTION ) MEMBER [Measures].[ParameterValue] AS [Company].[Company Name].CURRENTMEMBER.UNIQUENAME MEMBER [Measures].[ParameterLevel] AS IIF( [Company].[Company Name].CURRENTMEMBER.LEVEL IS NULL, -1, -- 无效成员设置默认层级值 [Company].[Company Name].CURRENTMEMBER.LEVEL.ORDINAL ) SELECT { [Measures].[ParameterCaption], [Measures].[ParameterValue], [Measures].[ParameterLevel] } ON COLUMNS, [Company].[Company Name].ALLMEMBERS ON ROWS FROM [HierarchyErrorCube] WHERE STRTOSET( "{[Company].[Country Name].&[Germany]}" );
另外,你也可以尝试用CURRENTMEMBER.NAME代替MEMBER_CAPTION,两者在大多数场景下效果一致,但NAME的解析逻辑更简单,可能避免内部异常。
方案3:检查并修复数据源数据
排查德国地区的Company数据:是否存在CompanyName为NULL的记录?或者某个公司的CompanyParentSK指向的父节点不在德国地区的筛选结果中?如果是前者,你可以在数据源中为这些空名称设置默认值(比如“未命名公司”);如果是后者,结合方案1的隐藏设置即可解决。
为什么德国报错而澳大利亚正常?
大概率是德国地区的成员结构中存在“孤立”成员(父节点不在筛选后的结果集里)或者空名称成员,而澳大利亚的数据没有这种情况。当SSAS尝试为这些特殊成员获取MEMBER_CAPTION时,触发了未处理的内部逻辑异常。
内容的提问来源于stack exchange,提问作者Michał Pawlikowski
相关产品推荐
相关产品推荐

