使用来自 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
。这对我的目的来说完全没问题。
我正在尝试使用 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
。这对我的目的来说完全没问题。