T-SQL 功能強大,但某些情境(如複雜運算、外部 API 呼叫)仍受限。SQL Server 提供 sp_OACreate 等 OLE Automation 預存程序,讓預存程序能像 ASP 一樣建立並呼叫 COM 物件。
' 專案名稱:testSQLCOM
' 類別名稱:TestMath
Public Function AddMe(a As Long, b As Long) As Long
AddMe = a + b
End Function
編譯產生 testSQLCOM.dll 並註冊至系統。
DECLARE @obj INT, @ret INT, @hr INT, @errSrc VARCHAR(255), @errDesc VARCHAR(255);
-- 1. 建立 COM 實例
EXEC @hr = sp_OACreate 'testSQLCOM.TestMath', @obj OUT;
IF @hr <> 0 BEGIN
EXEC sp_OAGetErrorInfo @obj, @errSrc OUT, @errDesc OUT;
PRINT '建立失敗: ' + @errSrc + ' ' + @errDesc;
RETURN;
END
-- 2. 呼叫方法
EXEC @hr = sp_OAMethod @obj, 'AddMe', @ret OUT, 100, 200;
IF @hr <> 0 BEGIN
EXEC sp_OAGetErrorInfo @obj, @errSrc OUT, @errDesc OUT;
PRINT '呼叫失敗: ' + @errSrc + ' ' + @errDesc;
EXEC sp_OADestroy @obj;
RETURN;
END
PRINT '回傳結果: ' + CAST(@ret AS VARCHAR(10)); -- 輸出 300
-- 3. 釋放物件
EXEC sp_OADestroy @obj;
| 預存程序 | 對應 VB/VBScript | 用途 |
|---|---|---|
sp_OACreate | CreateObject | 建立 COM 實例 |
sp_OAMethod | Object.Method | 呼叫方法/取得/設定屬性 |
sp_OAGetProperty | Object.Property | 取得屬性值 |
sp_OASetProperty | Object.Property = Value | 設定屬性值 |
sp_OAGetErrorInfo | Err.Object | 取得錯誤來源與描述 |
sp_OADestroy | Set Object = Nothing | 釋放物件 |
sp_OA* 呼叫必須檢查回傳碼(@hr),非 0 即失敗。RETURN 或 RAISERROR。OUT / OUTPUT,否則不會回傳值且不報錯。