У меня динамический встроенный 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.
Спасибо!