Спасибо!

я динамический встроенный MDX-запрос (через PHP), который выполняется функцией EXEC, а результат вставляется во временную таблицу, поэтому я могу использовать следующий SQL-запрос, как показано ниже:

SET NOCOUNT ON
Declare @ResultTable TABLE (
  "xxx.[my_dimension].[my_dimension].MEMBER_CAPTION" varchar(1000), 
  "[Measures].[my_value]" varchar(1000), 
  "[Measures].[my_dimension]" varchar(1000)
)
Declare @MdxQueryPart nvarchar(max) 
Set @MdxQueryPart = 'EXEC(''
  WITH
  MEMBER [Measures].[my_dimension] as xxx.[my_dimension].CurrentMember.MEMBER_CAPTION 
  SELECT {
    [Measures].[my_value],
    [Measures].[my_dimension]
  } ON COLUMNS,
  NONEMPTY(
    xxx.[my_dimension].CHILDREN,
    {
      [Measures].[my_value]
    }
  ) ON ROWS
  FROM my_cube''
) at linked_server'

EXEC sp_serveroption 'linked_server', 'remote proc transaction promotion',  'false'

INSERT INTO @ResultTable
EXECUTE sp_executesql @MdxQueryPart

EXEC sp_serveroption 'linked_server', remote proc transaction promotion', 'true';

SELECT * FROM @ResultTable

Когда в my_value есть данные, он возвращает 3 столбца (те, что в @ResultTable, в этом порядке). Когда данных нет, он не возвращает первый столбец (что является ожидаемым поведением, так как я использую NONEMPTY) и выдает эту ошибку:

Column name or number of supplied values does not match table definition.

Если я удалю NONEMPTY, он вернет слишком много бесполезных данных.

Так что я думаю, есть ли способ сохранить результат MDX (аналогично тому, что делает NONEMPTY), но убедиться, что все столбцы появятся (но без данных, например). Другой вариант - удалить первый столбец в @ResultTable, но я должен каким-то образом знать, какие столбцы возвращаются из MDX.

Я подумываю использовать два отдельных запроса, но сначала хотел бы узнать, возможно ли сделать вышеупомянутое с помощью одного оператора.

Я также попробовал это решение, но пока безуспешно:Заставить MDX-запрос возвращать имена столбцов (Я не смог вернуть столбец «xxx. [my_dimension]. [my_dimension] .MEMBER_CAPTION» на фиктивном наборе)

Я использую Sql Server 2012.

Спасибо!

Ответы на вопрос(0)

Ваш ответ на вопрос