sp_OACreate (Transact-SQL)
适用范围:SQL Server
创建 OLE 对象的实例。
语法
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 服务器(通过使用上下文值 1
或 5
未指定上下文值),则它有权访问 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