Sql server 在T-SQL中执行MDX with子句会引发错误
参考: 感谢您帮助解答有关使用MDX将SSAS成员分组到存储桶的问题。在SSAS中独立运行或直接在SSMS中运行时,它可以完美地工作 但是,我尝试将其包装在T-SQL过程中,以使用以下命令将记录插入表中,执行失败并显示错误消息:Sql server 在T-SQL中执行MDX with子句会引发错误,sql-server,tsql,ssas,mdx,Sql Server,Tsql,Ssas,Mdx,参考: 感谢您帮助解答有关使用MDX将SSAS成员分组到存储桶的问题。在SSAS中独立运行或直接在SSMS中运行时,它可以完美地工作 但是,我尝试将其包装在T-SQL过程中,以使用以下命令将记录插入表中,执行失败并显示错误消息: declare @query nvarchar(4500) set @query = 'insert into ssas_results select * from OPENQUERY(ssaslink,''
declare @query nvarchar(4500)
set @query = 'insert into ssas_results
select * from OPENQUERY(ssaslink,''
select * from
(
WITH
SET [RestOfWorld] AS
{
[Customer].[Customer Geography].[Country].&[United Kingdom]
,[Customer].[Customer Geography].[Country].&[Germany]
}
MEMBER [Customer].[Customer Geography].[All].[RestOfWorld] AS
Aggregate
(
{
[Customer].[Customer Geography].[Country].&[United Kingdom]
,[Customer].[Customer Geography].[Country].&[Germany]
}
)
SET [CountriesMinusROW] AS
[Customer].[Customer Geography].[Country].MEMBERS - [RestOfWorld]
SELECT
NON EMPTY
{[Measures].[Internet Sales Amount]} ON 0
,NON EMPTY
[Product].[Category].[Category]
*
{
[CountriesMinusROW]
,[Customer].[Customer Geography].[All].[RestOfWorld]
} ON 1
FROM [Adventure Works]
WHERE
[Date].[Calendar Year].&[2007] )'') AS SSASREC'
exec (@query)
When I executed the stored procedure, I get the error message:
OLE DB provider "MSOLAP" for linked server "ssaslink" returned message "Subselects and subcubes cannot define new calculations using the WITH clause.".
信息7321,16级,状态2,第2行
准备查询时出错“
SSAS中不支持这种方法吗?使用存储过程将查询结果插入表中的最佳方法是什么?OPENQUERY中的第二个参数必须是有效的
MDX
,因为这将在定义的SSAS服务器实例上执行。去掉select*from(…)作为SSASREC
构造,只需将MDX
保留在引号内即可
根据OP的评论编辑
对于包含参数,MDX具有特殊的和功能。
注意:虽然在这种情况下并不需要使用strotmember
/strotset
,但这些函数可以提供一定程度的安全性。当这些函数中的第二个参数为“constrated”时,它将过滤掉注入攻击。因此在安全性方面是一个“加号”
来自BOL
使用受限标志时,成员名称必须可直接解析为限定或非限定成员名称。此标志用于降低通过指定字符串进行注入攻击的风险。如果提供的字符串不能直接解析为限定或非限定成员名称,则会出现以下错误:违反了STRTOMEMBER函数中受约束标志施加的限制。”
试试下面的方法
declare @query nvarchar(4500)
declare @date VARCHAR(30)
set @date = '[Date].[Calendar Year].&[' + '2007' + ']'
set @query = 'select * from OPENQUERY(ssaslink,
''WITH
SET [RestOfWorld] AS
{
[Customer].[Customer Geography].[Country].&[United Kingdom]
,[Customer].[Customer Geography].[Country].&[Germany]
}
MEMBER [Customer].[Customer Geography].[All].[RestOfWorld] AS
Aggregate
(
{
[Customer].[Customer Geography].[Country].&[United Kingdom]
,[Customer].[Customer Geography].[Country].&[Germany]
}
)
SET [CountriesMinusROW] AS
[Customer].[Customer Geography].[Country].MEMBERS - [RestOfWorld]
SELECT
NON EMPTY
{[Measures].[Internet Sales Amount]} ON 0
,NON EMPTY
[Product].[Category].[Category]
*
{
[CountriesMinusROW]
,[Customer].[Customer Geography].[All].[RestOfWorld]
} ON 1
FROM [Adventure Works]
WHERE
StrToMember('''+CAST(@date AS VARCHAR(50))+''',CONSTRAINED)'''
insert into ssas_results
exec (@query)
实际上,只需重复苏拉夫已经说过的话-您可以简化为以下内容: 无需在此上下文中使用
strotmember
,因为您将整个脚本作为字符串传递
DECLARE @Year INTEGER = YEAR(GETDATE());
DECLARE @DtString VARCHAR(50)= '[Date].[Calendar Year].&[' + CONVERT(VARCHAR(10),@Year) + ']';
INSERT INTO ssas_results
SELECT
*
FROM
OPENQUERY
(
ssaslink,
'
WITH
SET [RestOfWorld] AS
{
[Customer].[Customer Geography].[Country].&[United Kingdom]
,[Customer].[Customer Geography].[Country].&[Germany]
}
MEMBER [Customer].[Customer Geography].[All].[RestOfWorld] AS
Aggregate
(
{
[Customer].[Customer Geography].[Country].&[United Kingdom]
,[Customer].[Customer Geography].[Country].&[Germany]
}
)
SET [CountriesMinusROW] AS
[Customer].[Customer Geography].[Country].MEMBERS - [RestOfWorld]
SELECT
NON EMPTY
{[Measures].[Internet Sales Amount]} ON 0
,NON EMPTY
[Product].[Category].[Category]
*
{
[CountriesMinusROW]
,[Customer].[Customer Geography].[All].[RestOfWorld]
} ON 1
FROM [Adventure Works]
WHERE '
+
@DtString
+
';'
);
感谢whytheq和SouravA的回复。我确实需要将其包装在T-SQL过程中,因为日期和其他一些字段是可变的,并插入到表中进行其他计算。不过,我最初确实尝试过——将MDX直接保留在引号中,并得到了相同的错误。我会再次尝试——也许我没有做正确的操作这是第一次。我的观点是正确的。我对
OPENQUERY
几乎没有经验。你的建议是正确的。