【问题标题】:Handling MDX OPENQUERY, The identifier that starts with is too long. Maximum length is 128处理MDX OPENQUERY,开头的标识符太长。最大长度为 128
【发布时间】:2015-02-12 00:45:53
【问题描述】:

我在使用 openquery 时遇到问题。我想选择带有它的名称的列,但名称太长,因为有很多级别

SELECT 
     A."[Dimension].[NAMEOFLEVEL1].[NAMEOFLEVEL2].[NAMEOFLEVEL3].[NAMEOFLEVEL4].[NAMEOFLEVEL5].[NAMEOFLEVEL6]" AS Acc2 
FROM OPENQUERY(CUBEX,
        'SELECT 
            ({
                [Dimension].[NAMEOFLEVEL1].[NAMEOFLEVEL2].[NAMEOFLEVEL3].[NAMEOFLEVEL4].[NAMEOFLEVEL5].[NAMEOFLEVEL6]
            }) DIMENSION PROPERTIES MEMBER_KEY 
            ON COLUMNS, 
            NON EMPTY (
                [TIME].[MONTH]
            ) DIMENSION PROPERTIES MEMBER_KEY 
            ON ROWS
        FROM [MyTable] 
    ') A

错误如下:

以“[Dimension].[NAMEOFLEVEL1].[NAMEOFLEVEL2].[NAMEOFLEVEL3].[NAMEOFLEVEL4].[NAMEOFLEVEL5].[NAMEOFLEVEL6]”开头的标识符太长。最大长度为 128。

【问题讨论】:

  • OPENQUERY 存在限制。我遇到的第二个参数允许的总字符串长度也有限制。

标签: sql-server-2008 mdx


【解决方案1】:

OPENQUERY 没有限制。它是 SQL column name 的限制 - 实际上是 128 个字符。

不过,您的情况更容易 - 无需列出所有层次结构以将其名称包含在输出中

SELECT 
 A."[Dimension].[NAMEOFLEVEL1].[MEMBER_CAPTION]" as Level1,
 A."[Dimension].[NAMEOFLEVEL2].[MEMBER_CAPTION]" as Level2
 ...
 FROM OPENQUERY(CUBEX,
    'SELECT 
        ({
            [Dimension].[NAMEOFLEVEL6].members
        }) DIMENSION PROPERTIES MEMBER_KEY 
        ON COLUMNS, 
        NON EMPTY (
            [TIME].[MONTH]
        ) DIMENSION PROPERTIES MEMBER_KEY 
        ON ROWS
    FROM [MyTable] 
') A

如果您在 MDX 中遇到非常长的名称(假设 Dimension 全名 + Member_CAPTION 用作列名),则将您的关卡包装在一个名称较短的集合中。

SELECT 
 A."[Measures].[allLevels].[MEMBER_CAPTION]" AS Acc2 
 FROM OPENQUERY(CUBEX,
    'with member allLevels as
      (
          [Dimension].[NAMEOFLEVEL1].[NAMEOFLEVEL2].[NAMEOFLEVEL3].[NAMEOFLEVEL4].[NAMEOFLEVEL5].[NAMEOFLEVEL6].members
      )

      SELECT 
        ({
           [Measures].[allLevels]
        }) DIMENSION PROPERTIES MEMBER_KEY 
        ON COLUMNS, 
        NON EMPTY (
            [TIME].[MONTH]
        ) DIMENSION PROPERTIES MEMBER_KEY 
        ON ROWS
    FROM [MyTable] 
') A

【讨论】:

    【解决方案2】:

    一个可能的解决方法是从使用User Hierarchy 切换到具有更小的标识符的等效Attribute Hierarchy

    --USER HIERARCHY EXAMPLE
    SELECT 
         "[Date].[Date - Calendar Month].[Calendar Month].[MEMBER_CAPTION]"
    FROM OPENQUERY(linkedName,
    '
    SELECT 
      {[Measures].[xxx]} ON 0
     ,NON EMPTY 
        [Date].[Date - Calendar Month].[Calendar Month].MEMBERS ON 1
    FROM [OurCube];')
    
    
    --ATTRIBUTE HIERARCHY EXAMPLE - NOT MUCH SMALLER IN OUR CUBE
    SELECT 
         "[Date].[Calendar Month].[Calendar Month].[MEMBER_CAPTION]"
    FROM OPENQUERY(linkedName,
    '
    SELECT 
      {[Measures].[xxx]} ON 0
     ,NON EMPTY 
        [Calendar Month].[Calendar Month].MEMBERS ON 1
    FROM [OurCube];')
    

    也许你的缩短成这样:

    SELECT 
         A."[Dimension].[NAMEOFLEVEL6].[NAMEOFLEVEL6]" AS Acc2 
    FROM OPENQUERY(CUBEX,
            'SELECT 
                ({
                    [Dimension].[NAMEOFLEVEL6].[NAMEOFLEVEL6]
                }) DIMENSION PROPERTIES MEMBER_KEY 
                ON COLUMNS, 
                NON EMPTY (
                    [TIME].[MONTH]
                ) DIMENSION PROPERTIES MEMBER_KEY 
                ON ROWS
            FROM [MyTable] 
        ') A
    

    【讨论】:

    • 它是一个父子类型,从1到5的级别。我不知道这种情况下该怎么做。
    • 我要做的是获取所有级别的值并应用 COALESCE 来获取两者之间的 NOT NULL 值。
    • 还有一个问题,X成员的层级名称是一样的[Dimension].[NAMEOFLEVEL].[NAMEOFLEVEL].[NAMEOFLEVEL].[NAMEOFLEVEL].[NAMEOFLEVEL==== X 成员]。我不知道如何做类似 [Dimension].level(1).[Xmember] 之类的事情
    • 我没有亲子维度的经验,所以无法提供帮助。我们有一个非常好的贡献者@FrankPI,他可能会提供帮助。尽管您的最后评论是一个新的单独问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-24
    • 2021-10-04
    相关资源
    最近更新 更多