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


sp_OACreate (Transact-SQL)

Область применения: SQL Server

Создает экземпляр OLE-объекта.

Соглашения о синтаксисе Transact-SQL

Синтаксис

sp_OACreate { progid | clsid }
    , objecttoken OUTPUT
    [ , context ]
[ ; ]

Аргументы

progid

Программный идентификатор (ProgID) создаваемого объекта OLE. Эта строка символов описывает класс объекта OLE и имеет форму: <OLEComponent>.<Object>

OLEComponent — это имя компонента сервера автоматизации OLE, а объект — имя объекта OLE. Указанный объект OLE должен быть допустимым IDispatch и должен поддерживать интерфейс.

Например, SQLDMO.SQLServer это progID объекта SQL-DMO SQLServer . SQL-DMO имеет имя компонента SQLDMO, SQLServer объект действителен и (как и все объекты SQL-DMO), SQLServer который поддерживает IDispatchобъект.

clsid

Идентификатор класса (CLSID) создаваемого объекта OLE. Эта строка символов описывает класс объекта OLE и имеет форму: {<nnnnnnnn-nnnn-nnnn-nnnn-nnnnnnnnnnnn>} Указанный объект OLE должен быть допустимым IDispatch и должен поддерживать интерфейс.

Например, {00026BA1-0000-0000-C000-000000000046} clSID объекта SQL-DMO SQLServer .

objecttoken OUTPUT

Возвращаемый маркер объекта и должен быть локальной переменной типа данных int. Этот маркер объекта определяет созданный объект OLE и используется в вызовах других хранимых процедур OLE Automation.

контекст

Указывает контекст выполнения, в котором запускается созданный OLE-объект. Если задано, это значение должно быть одним из следующих параметров:

  • 1 = только сервер OLE в процессе (.dll)
  • 4 = только локальный (.exe) СЕРВЕР OLE
  • 5 = разрешено как в процессе, так и локальном сервере OLE

Если не задано, по умолчанию используется значение 5. Это значение передается в качестве параметра dwClsContext вызова CoCreateInstance.

Если внутрипроцессный сервер OLE разрешен (с помощью контекстного значения 1 или 5 без указания значения контекста), он имеет доступ к памяти и другим ресурсам, принадлежащим SQL Server. Сервер OLE в процессе может повредить память ИЛИ ресурсы SQL Server и привести к непредсказуемым результатам, таким как нарушение доступа к SQL Server.

При указании контекстного 4значения локальный OLE-сервер не имеет доступа к ресурсам SQL Server и не может повредить память или ресурсы SQL Server.

Примечание.

Аргументы для данной хранимой процедуры указываются по позиции, а не по имени.

Значения кода возврата

0 (успешно) или ненулевое число (сбой), которое является целым значением HRESULT, возвращаемым объектом OLE Automation.

Дополнительные сведения о кодах возврата HRESULT см. в разделе "Коды возврата автоматизации OLE" и сведения об ошибках.

Замечания

Если включены процедуры автоматизации OLE, вызов sp_OACreate для запуска общей среды выполнения OLE Automation. Дополнительные сведения о включении автоматизации OLE см. в статье Ole Automation Procedures (параметр конфигурации сервера).

Созданный объект OLE автоматически уничтожается в конце пакета инструкций Transact-SQL.

Разрешения

Требуется членство в предопределенных ролях сервера sysadmin или разрешение на выполнение непосредственно в этой хранимой процедуре. Параметр конфигурации сервера Ole Automation Procedures должен быть включен для использования любой системной процедуры, связанной с OLE Automation.

Примеры

А. Использование ProgID

В следующем примере создается объект SQL-DMO SQLServer с помощью progID.

DECLARE @object INT;
DECLARE @hr INT;
DECLARE @src VARCHAR(255),
    @desc VARCHAR(255);

EXEC @hr = sp_OACreate 'SQLDMO.SQLServer',
    @object OUTPUT;

IF @hr <> 0
BEGIN
    EXEC sp_OAGetErrorInfo @object,
        @src OUTPUT,
        @desc OUTPUT

    RAISERROR ('Error Creating COM Component 0x%x, %s, %s', 16, 1, @hr, @src, @desc);

    RETURN
END;
GO

B. Использование CLSID

В следующем примере создается объект SQL-DMO SQLServer с помощью CLSID.

DECLARE @object INT;
DECLARE @hr INT;
DECLARE @src VARCHAR(255),
    @desc VARCHAR(255);

EXEC @hr = sp_OACreate '{00026BA1-0000-0000-C000-000000000046}',
    @object OUTPUT;

IF @hr <> 0
BEGIN
    EXEC sp_OAGetErrorInfo @object,
        @src OUTPUT,
        @desc OUTPUT

    RAISERROR ('Error Creating COM Component 0x%x, %s, %s', 16, 1, @hr, @src, @desc);

    RETURN
END;
GO