MDX не разпознава моите изрази като набори от кортежи?

Когато имам две препратки към членове със синтаксис &[Value], който е кръстосано свързан, тогава получавам тази грешка:

Заявка (3, 3) Функцията очаква израз за набор от кортежи за аргумента 1. Използван е низ или числов израз.

Забележете, че има два интервала в The function, сякаш се опитва да назове една от функциите, която няма име. Мога да пресъздам проблема с примерната база данни „Adventure Works DW 2008R2“.

Не работи:

SELECT
  NON EMPTY
  {
     [Date].[Day of Month].&[1]
    * [Sales Territory].[Sales Territory Country].&[Canada]
    * [Measures].[Sales Amount]
  }
  ON COLUMNS,  
  NON EMPTY
  {
    [Product].[Product Name]   
  }
  ON ROWS
  FROM [Adventure Works]

Върши работа:

SELECT
  NON EMPTY
  {
     [Date].[Day of Month].&[1]
    * {([Sales Territory].[Sales Territory Country].&[Canada])}
    * [Measures].[Sales Amount]
  }
  ON COLUMNS,  
  NON EMPTY
  {
    [Product].[Product Name]   
  }
  ON ROWS
  FROM [Adventure Works]

Също така работи:

SELECT
  NON EMPTY
  {
     {([Date].[Day of Month].&[1])}
    * [Sales Territory].[Sales Territory Country].&[Canada]
    * [Measures].[Sales Amount]
  }
  ON COLUMNS,  
  NON EMPTY
  {
    [Product].[Product Name]   
  }
  ON ROWS
  FROM [Adventure Works]

Също така работи:

SELECT
  NON EMPTY
  {
     [Date].[Day of Month].&[1]        
    * [Measures].[Sales Amount]
  }
  ON COLUMNS,  
  NON EMPTY
  {
    [Product].[Product Name]   
  }
  ON ROWS
  FROM [Adventure Works]

Също така работи:

SELECT
  NON EMPTY
  {
     [Sales Territory].[Sales Territory Country].&[Canada]    
    * [Measures].[Sales Amount]
  }
  ON COLUMNS,  
  NON EMPTY
  {
    [Product].[Product Name]   
  }
  ON ROWS
  FROM [Adventure Works]

Какво интерпретира израза ми, ако не като набор от кортежи? Постоянно се натъквам на подобни неща и наистина е объркващо какво се опитва да направи с моите набори от кортежи, които смята, че е низ или числов израз.


person AaronLS    schedule 20.09.2011    source източник


Отговори (2)


Това наистина е объркващо, защото изглежда, че няма голяма разлика между двете заявки. Проблемът е описан тук в публикация в блог: http://www.softwaremasons.com/MartinsBlog/tabid/74/EntryId/56/Is-SSAS-Too-Lenient-on-MDX-Syntax.aspx

Ако замените първия оператор * с функцията CrossJoin, ще откриете, че заявката се изпълнява добре.

* е просто CrossJoin, написан по различен начин - така че ако работи по единия начин и не успее по другия - можем да предположим, че проблемът е в начина, по който системата Analysis Services анализира оператора *. Когато добавите функцията CrossJoin, вие изрично връщате набор, който след това използва с * за кръстосано свързване с мярката и всичко е наред. Във вашите работни примери вие изрично сте идентифицирали набор с помощта на фигурни скоби, като по този начин давате на двигателя това, от което се нуждае, за да продължи със заявката - но когато се опитате да използвате * с два члена, това се проваля. Технически, всеки член е набор от един и трябва да работи, но двигателят не анализира заявката по този начин и се проваля.

Постът в блога по-горе е любезен, когато казва, че проблемът е снизходителността на MDX. Позволява ни да се измъкнем, без да въвеждаме силно нашите резултати (т.е. да изключим {} за въвеждане на член като набор). Аз самият бих го нарекъл грешка. :) Щом езикът ни позволява да сме свободни на едно място, трябва да е последователен навсякъде другаде.

person Stacia    schedule 28.05.2012

Изразът е набор от единичен кортеж (т.е. набор с кортеж, който е един конкретен член в куба. Това (объркващо) не е същото като набор от кортежи.

От MSDN - членове, кортежи и набори

Набори, съставени от един кортеж, не са кортежи; те се интерпретират като набори от MDX. Някои MDX функции приемат кортежи като параметри и ще предизвикат грешка, ако бъде подаден единичен набор от кортежи. Кортежите и наборите от единични кортежи не са взаимозаменяеми.

Що се отнася до съобщението за грешка, когато видите „Функцията“ с допълнителни интервали, това се отнася до неправилно образуван набор или кортеж във вашата заявка, към който няма приложена функция (следователно няма име на функция, което да поставите в съобщението за грешка) .

Например, ако сте написали заявка като EXCEPT([A].[B].[C], [D].[E].[F]) и един от тези параметри е невалиден, ще получите грешка, съдържаща „Функцията EXCEPT...“. Но ако просто имате зле дефиниран набор или кортеж, получавате „Функцията“ с два интервала. Това изглежда е лошо отчитане на грешки от MSAS!

person Sam Holloway    schedule 21.09.2011
comment
Благодаря, разбирам, че те са набори от единични кортежи. Можете ли да бъдете по-конкретни относно това, което е лошо оформено в моята заявка? Изключва [Date].[Day of Month].&[1] или [Sales Territory].[Sales Territory Country].&[Canada] и изключва и двете, ако някой от тях е изяснен със скоби, за да се изясни, че това е единичен набор от кортежи {()}. Така че, ако е зле оформено, защо е толкова непоследователно какво приема? - person AaronLS; 22.09.2011
comment
Добавих всички варианти, които работят, към публикацията ми. Очаквам, че ако заявката е формирана зле, тогава нито едно от тях няма да работи? Но фактът, че всички те работят с изключение на един, просто изглежда странен. - person AaronLS; 22.09.2011