Sql server 在T-SQL中执行MDX with子句会引发错误

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,''

参考:

感谢您帮助解答有关使用MDX将SSAS成员分组到存储桶的问题。在SSAS中独立运行或直接在SSMS中运行时,它可以完美地工作

但是,我尝试将其包装在T-SQL过程中,以使用以下命令将记录插入表中,执行失败并显示错误消息:

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
几乎没有经验。你的建议是正确的。