MDX не распознает мои выражения как наборы кортежей? - PullRequest
0 голосов
/ 20 сентября 2011

Когда у меня есть две ссылки на члены с синтаксисом & [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]

Что интерпретировало мое выражение, если не как набор кортежей?Я все время спотыкаюсь об этих вещах, и это действительно сбивает с толку то, что он пытается сделать с моими наборами кортежей, думая, что это строковое или числовое выражение.

Ответы [ 2 ]

3 голосов
/ 28 мая 2012

Это действительно сбивает с толку, поскольку кажется, что между этими двумя запросами нет большой разницы. Проблема описана здесь в сообщении в блоге:

Если вы замените первый * оператор на функцию CrossJoin, вы обнаружите, что запрос выполняется нормально.

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

Пост в блоге выше, когда говорится, что проблема заключается в мягкости MDX. Это позволяет нам избегать строгой типизации наших результатов (т.е. исключая {} для ввода члена в виде набора). Я бы назвал это ошибкой сам. :) Если язык позволяет нам быть свободным в одном месте, он должен быть последовательным везде.

2 голосов
/ 21 сентября 2011

Выражение является набором с одним кортежем (то есть набором с кортежем, который является одним конкретным элементом в кубе. Это (смущает) не то же самое, что набор кортежей.

От MSDN - Члены, кортежи и наборы

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

Что касается сообщения об ошибке, когда вы видите «Функцию» с лишними пробелами, это относится к неправильно сформированному набору или кортежу в вашем запросе, к которому не применена функция (следовательно, нет имени функции для вставки в сообщение об ошибке).

Например, если вы написали запрос, подобный EXCEPT([A].[B].[C], [D].[E].[F]), и один из этих параметров был недействительным, вы получите ошибку, содержащую «Функция EXCEPT ...». Но если у вас просто неправильно заданный набор или кортеж, вы получите «Функцию» с двумя пробелами. Похоже, что MSAS плохо сообщает об ошибках!

...