使用来自 OLAP 的 OPENQUERY 转换失败

Conversion failure using OPENQUERY from OLAP

我正在尝试使用 OPENQUERY 和 SQL 中的 MDX 字符串从 SSAS 多维数据集检索一些简单数据。

Cannot get the data of the row from the OLE DB provider "MSOLAP" for linked server "OLAP_LIVE". Conversion failed because the data value overflowed the data type used by the provider.

查询很简单:

select 
    StockCode = "[Product].[Stock Code].[Stock Code].[MEMBER_CAPTION]",
    LiveReturnPercent = "[Measures].[Live Return %]"

from openquery(
    My_OLAP_SERVER,
    'select
        non empty
        {
            [Measures].[Live Return %]
        }
        on columns,

        non empty
        {
            [Product].[Stock Code].allmembers
        }
        on rows

    from
        [Document DW]')

传输数据时发生错误 "before" 它到达 SQL - 即,我无法通过将第三行更改为类似以下内容来解决它:

LiveReturnPercent = left("[Measures].[Live Return %]", 1)

因为它仍然returns同样的错误。我不知道如何在 MDX 端格式化/trim 查询,因此它 returns 将度量作为较短的字符串。

如果我 运行 SSAS 中的 MDX 本机 运行 没问题。

似乎 SSAS 正在内部定义 [Measures].[Live Return %] 字符串的长度,然后尝试传回更长的字符串。

我该如何解决?

请注意,[Live Return %] returns 是一个像 12.34632456 这样的长浮动值,但我不需要那种精确度,所以 trimming 的答案有效12.34 就足够了。

我也无法修改多维数据集本身的度量定义 - 不是我的多维数据集;在其他地方广泛使用等

编辑:我也试过:

...
    LiveReturnPercent = "[Measures].[Live Return % Friendly]"

from openquery(
    My_OLAP_SERVER,
    'with member [Measures].[Live Return % Friendly] as
        [Measures].[Live Return %],
        FORMAT_STRING = "Percent"

    select
        non empty
        {
             [Measures].[Live Return % Friendly]
        }
        on columns,
...

但这也会导致相同的错误 - FORMAT_STRING 也像 "#.##%"

问题似乎出在 inf 值 returning 上,因为度量定义为:

[Measures].[Some Measure] / [Measures].[Some Other Measure]

其中 [Some Other Measure] 可以为零。本机 mdx 查询在结果集中整齐地输出 inf 而不会出错,但通过 openquery 似乎会导致溢出错误。

我发现 Divide 函数 returns null 而不是 inf 所以我能够通过将 MDX 更改为:

with member [Measures].[Live Return % NoInf] as
    Divide([Measures].[Some Measure], [Measures].[Some Other Measure])

select
    non empty
    {
        [Measures].[Live Return % NoInf]
    } 
    on columns,
...

有效计算相同的度量,但 return null inf 个值。

请注意 这将 return 一个与原始结果集略有不同的结果 - non empty 将抑制之前的 inf 结果他们现在 null。这对我的目的来说完全没问题。