sp_OACreate (Transact-SQL)

适用范围:SQL Server

创建 OLE 对象的实例。

Transact-SQL 语法约定

语法

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

参数

progid

要创建的 OLE 对象的编程标识符(ProgID)。 此字符串描述 OLE 对象的类,并具有以下形式: <OLEComponent>.<Object>

OLEComponent 是 OLE 自动化服务器的组件名称,Object 是 OLE 对象的名称。 指定的 OLE 对象必须有效,并且必须支持 IDispatch 接口。

例如, SQLDMO.SQLServer 是 SQL-DMO SQLServer 对象的 ProgID。 SQL-DMO 具有 SQLDMO 的组件名称,该SQLServer对象有效,并且对象支持IDispatch的所有 SQL-DMO 对象( 如所有 SQL-DMO 对象SQLServer)。

clsid

要创建的 OLE 对象的类标识符 (CLSID)。 此字符串描述 OLE 对象的类,并具有以下形式: {<nnnnnnnn-nnnn-nnnn-nnnn-nnnnnnnnnnnn>}。 指定的 OLE 对象必须有效,并且必须支持 IDispatch 接口。

例如, {00026BA1-0000-0000-C000-000000000046} SQL-DMO SQLServer 对象的 CLSID。

objecttoken OUTPUT

返回的对象标记,并且必须是数据类型 int 的局部变量。此对象令牌标识创建的 OLE 对象,并在调用其他 OLE 自动化存储过程时使用。

context

指定要运行新创建的 OLE 对象的执行上下文。 如果指定,此值必须是下列选项之一:

  • 1 = 仅限进程内 (.dll) OLE 服务器
  • 4 = 仅本地 (.exe) OLE 服务器
  • 5 = 进程内和本地 OLE 服务器均允许

如果未指定,默认值为 5。 此值作为调用CoCreateInstance的 dwClsContext 参数传递。

如果允许进程内 OLE 服务器(通过使用上下文值 15 未指定上下文值),则它有权访问 SQL Server 拥有的内存和其他资源。 进程内 OLE 服务器可能会损坏 SQL Server 内存或资源,并导致不可预知的结果,例如 SQL Server 访问冲突。

指定上下文值 4时,本地 OLE 服务器无权访问任何 SQL Server 资源,并且它不能损坏 SQL Server 内存或资源。

注意

此存储过程的参数按位置指定,而不是按名称指定。

返回代码值

0 (success) 或非零数 (failure) 是 OLE 自动化对象返回的 HRESULT 的整数值。

有关 HRESULT 返回代码的详细信息,请参阅 OLE 自动化返回代码和错误信息

注解

如果启用了 OLE 自动化过程,则调用以 sp_OACreate 启动 OLE 自动化共享执行环境。 有关启用 OLE 自动化的详细信息,请参阅 Ole Automation Procedures(服务器配置选项)。

创建的 OLE 对象在 Transact-SQL 语句批处理的末尾自动销毁。

权限

需要 sysadmin 固定服务器角色的成员身份或直接在此存储过程上执行权限。 必须启用 Ole Automation Procedures 服务器配置选项,才能使用与 OLE 自动化相关的任何系统过程。

示例

A. 使用 ProgID

以下示例使用其 ProgID 创建 SQL-DMO SQLServer 对象。

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

以下示例使用其 CLSID 创建 SQL-DMO SQLServer 对象。

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