【问题标题】:Conversion failure using OPENQUERY from OLAP使用来自 OLAP 的 OPENQUERY 转换失败
【发布时间】:2019-09-18 08:54:30
【问题描述】:

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

无法从 OLE DB 提供程序“MSOLAP”获取该行的数据 链接服务器“OLAP_LIVE”。转换失败,因为数据值 溢出了提供者使用的数据类型。

查询很简单:

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]')

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

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

因为它仍然返回相同的错误。我不知道如何在 MDX 端格式化/修剪查询,以便将度量作为较短的字符串返回。

如果我在 SSAS 中本地运行 MDX,它运行良好。

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

我该如何解决这个问题?

请注意,[Live Return %] 返回一个像 12.34632456 这样的长浮点值,但我不需要那种级别的准确度,因此将其修剪为 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_STRINGs 也一样,比如"#.##%"

【问题讨论】:

    标签: sql-server ssas mdx openquery


    【解决方案1】:

    问题似乎在于 inf 值返回,因为度量定义为:

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

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

    我发现 Divide 函数返回 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,
    ...
    

    有效地计算相同的度量值,但为 inf 值返回 null

    注意这将返回与原始结果集略有不同的结果集 - non empty 将抑制以前的 inf 结果,因为它们现在是 null。这对我的目的来说非常好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-24
      • 1970-01-01
      • 1970-01-01
      • 2019-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多