T-SQL から COM のメソッドを呼ぶ方法

Transact-SQL から呼び出せる COM とは・・・ディスパッチインターフェイスを実装

Transact-SQL では COM コンポーネントのメソッドを呼び出すための仕組みが実装されています。 COM を利用したい場合は、sp_OACreate で COM オブジェクトを生成して、sp_OAMethod でメソッドを呼び出します

ただし、COM コンポーネントといっても、全ての COM が利用できるわけではなく、その中でもディスパッチインターフェイス (IDispatch インターフェイス) を実装したもののみが、sp_OACreate でインスタンス化可能です。

ディスパッチインターフェイスはもともと、クラシック VB (VB, VBA, VBScript) などの環境から簡単に呼び出せるように作られました。 Transact-SQL からも、このディスパッチインタフェイス経由でメソッドを簡単に呼び出せる、というわけです。

COM インターフェイスに加えて IDispatch インターフェイスも実装した、いわゆるデュアルインターフェイスを実装した COM コンポーネントを自作する方法は、次の資料などをご覧ください。

ちなみに、こうして他のプログラムから外部コンポーネントを呼び出せる仕組みを、 OLE オートメーション (OLE Automation) といいます。

OLE と聞くといつも思い出すジョークをひとつ...
「マイクロソフトのテクノロジーで優れているのは OLE (オーレ)。それと OBEY (オーベイ 「服従させる」) だ。」
今でこそマイクロソフトは以前のような勢いがなくなってきていますが(?)、 以前は仕様策定などに対してオープンではない点などでヒンシュクを買うこともしばしばでしたので...

T-SQL から OLE オートメーションを利用するときの準備

Transact-SQL から OLE オートメーションを利用する場合の準備があります。 デフォルトでは OLE オートメーションの利用はセキュリティ上できないようになっています。 このため、OLE オートメーションを有効にしないまま呼び出しを行うと、次のようなエラーメッセージが表示されます。

SQL Server blocked access to procedure 'sys.sp_OACreate' of component 
'Ole Automation Procedures' because this component is turned off 
as part of the security configuration for this server. 
A system administrator can enable the use of 'Ole Automation Procedures' 
by using sp_configure. For more information about enabling 
'Ole Automation Procedures', see "Surface Area Configuration" 
in SQL Server Books Online.

OLE オートメーションを有効にするには、Ole Automation Procedures アドバンストオプションを有効にします。

sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'Ole Automation Procedures', 1;
GO
RECONFIGURE;
GO

T-SQL から OLE オートメーションを利用する実行例

ここでは具体的に、Visual Studio の ATL コンポーネントウィザードで COM+ コンポーネントを作る方法 で作成した COM を呼び出す例で、OLE オートメーションを利用する方法を示します。

まず比較のため、VBScript で書いたコードを示します。

Dim obj
Set obj = CreateObject( "KeicodeTest.DebugTrace" )
obj.Write "Hello, world!"
Set obj = Nothing

この VBScript コードと同等な T-SQL コードは次の通りです。

DECLARE @obj    INT ;
DECLARE @hr     INT ;

EXEC @hr = sp_OACreate 'KeicodeTest.DebugTrace', @obj OUT ;
EXEC @hr = sp_OAMethod @obj, 'Write', NULL, 'Hello, world!';
EXEC @hr = sp_OADestroy @obj;

sp_OACreate でオブジェクトを生成します。成功した場合 0 を返します。 メソッドの呼び出しは sp_OAMethod に、オブジェクト、メソッド名、パラメータを渡して呼び出します。 オブジェクトを破棄する場合は、sp_OADestroy を呼び出します。

エラー情報を取得する場合は、次のように sp_OAGetErrorInfo を利用してエラー情報を取得します。

DECLARE @src    VARCHAR (255);
DECLARE @desc   VARCHAR (255);

IF @hr <> 0
BEGIN
    EXEC sp_OAGetErrorInfo @obj, @src OUT , @desc OUT  ;
    RAISERROR ('ERROR 0x%x, %s, %s',16, 1, @hr, @src, @desc);
    RETURN 
END

このように、sp_OA* 系のシステムストアドプロシージャを呼び出すことによって、COM (OLE オートメーション) を利用することが可能になります。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Web/DB プログラミング徹底解説