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


sp_OACreate (Transact-SQL)

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

Значок ссылки на разделСинтаксические обозначения в Transact-SQL

Синтаксис

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

Аргументы

  • progid
    Программный идентификатор (ProgID) создаваемого OLE-объекта. Данная строка символов описывает класс OLE-объекта и имеет следующий вид: 'OLEComponent.Object'

    OLEComponent — это имя компонента сервера OLE-автоматизации, а Object — это имя 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.

  • objecttokenOUTPUT
    Возвращаемый маркер объекта, должен быть локальной переменной типа int. Маркер объекта идентифицирует созданный OLE-объект и используется в вызовах других хранимых процедур OLE-автоматизации.

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

    1 = только внутрипроцессный OLE-сервер (DLL);

    4 = только локальный OLE-сервер (EXE);

    5 = допустимы и внутрипроцессный, и локальный OLE-серверы.

    Значение аргумента по умолчанию — 5. Это значение передается с помощью аргумента dwClsContext при вызове функции CoCreateInstance.

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

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

    ПримечаниеПримечание

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

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

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

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

Замечания

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

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

Разрешения

Необходимо членство в предопределенной роли сервера sysadmin.

Примеры

А. Использование идентификатора 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 OUT;
IF @hr <> 0
BEGIN
   EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT 
   raiserror('Error Creating COM Component 0x%x, %s, %s',16,1, @hr, @src, @desc)
    RETURN
END;
GO

Б. Использование идентификатора 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 OUT;
IF @hr <> 0
BEGIN
   EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT 
   raiserror('Error Creating COM Component 0x%x, %s, %s',16,1, @hr, @src, @desc)
    RETURN
END;
GO