Поделиться через


Вызов хранимых процедур

Хранимые процедуры можно вызывать на сервере или из клиентского приложения. В любом случае хранимые процедуры всегда выполняются на сервере либо в контексте сервера, либо в контексте базы данных. Для выполнения хранимой процедуры не нужны специальные разрешения. После того как хранимая процедура добавлена сборкой к контексту сервера или базы данных, любой пользователь может выполнить эту хранимую процедуру, если только роль для этого пользователя разрешает действия, выполняемые этой хранимой процедурой.

Вызов хранимой процедуры в многомерном выражении осуществляется аналогично вызову внутренней функции многомерного выражения. Для хранимой процедуры, не принимающей параметров, используется имя процедуры и пустая пара скобок, как показано ниже:

MyStoredProcedure()

Если хранимая процедура принимает один или несколько параметров, то параметры вводятся по порядку и разделены запятыми. В следующем примере демонстрируется образец хранимой процедуры с тремя параметрами:

MyStoredProcedure("Parameter1", 2, 800)

Вызов хранимых процедур в запросах многомерных выражений

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

Возврат набора

В следующих примерах реализуется хранимая процедура, имеющая имя MySproc, которая возвращает набор. В первом примере MySproc возвращает набор непосредственно в выражении SELECT. В следующих двух примерах MySproc возвращает набор в качестве аргумента для функций Crossjoin и DrilldownLevel.

SELECT MySetProcedure(a,b,c) ON 0 FROM Sales
SELECT Crossjoin(MySetProcedure(a,b,c)) ON 0 FROM Sales
SELECT DrilldownLevel(MySetProcedure(a,b,c)) ON 0 FROM Sales

Возврат элемента

В следующем примере показана функция MySproc, возвращающая элемент:

SELECT Descendants(MySproc(a,b,c),3) ON 0 FROM Sales

Возврат результата математической операции

SELECT Country.Members on 0, MySproc(Measures.Sales) ON 1 FROM Sales

Вызов хранимых процедур с использованием инструкции Call

Хранимые процедуры можно вызывать вне контекста запроса многомерного выражения, используя инструкцию Call многомерного выражения.

Этот метод можно использовать либо для создания экземпляра побочных эффектов хранимого запроса, либо для получения приложением результатов хранимого запроса. Часто инструкция Call применяется для использования объектов AMO для выполнения административных функций, которые необязательно возвращают результат. Например, следующая команда вызывает хранимую процедуру:

Call MyStoredProcedure(a,b,c)

Единственным поддерживаемым типом, возвращаемым из хранимой процедуры в инструкции Call, является набор строк. Упорядочивание для набора строк определяется XML для аналитики. Если хранимая процедура в инструкции Call возвращает любой другой тип, то он игнорируется и не возвращается в XML вызывающему приложению. Дополнительные сведения о наборах строк XML для аналитики см. в разделе «Наборы строк схемы XML для аналитики».

Если хранимая процедура возвращает набор строк платформы .NET, то службы Службы Analysis Services преобразуют результат на сервере в набор строк XML для аналитики. Набор строк XML для аналитики всегда возвращается хранимой процедурой в функции Call. Если набор данных содержит элементы, которые нельзя выразить в наборе строк XML для аналитики, то происходит сбой.

Процедуры, возвращающие значения void (например, подпрограммы языка Visual Basic), также могут использоваться с ключевым словом CALL. Например, если необходимо использовать функцию MyVoidFunction() в инструкции многомерного выражения, то нужно применить следующий синтаксис:

CALL(MyVoidFunction)