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 как наборы. Некоторые функции многомерных выражений принимают кортежи в качестве параметров и вызывают ошибку, если передается один набор кортежей. Кортежи и наборы из одного кортежа не взаимозаменяемы.

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

Например, если вы написали такой запрос, как EXCEPT([A].[B].[C], [D].[E].[F]), и один из этих параметров был недопустимым, вы получите сообщение об ошибке, содержащее «Функция, КРОМЕ…». Но если у вас просто плохо определенный набор или кортеж, вы получите «Функция» с двумя пробелами. Кажется, 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