T-SQL 在資料操作強大,但缺乏與外部系統(檔案、登錄、郵件、Office、Active Directory)互動的能力。SQL Server 內建 7 條 COM 自動化擴展預存程序,允許在預存程序中建立、操作、銷毀 COM 物件,打破資料庫邊界。
| 程序 | 用途 |
|---|---|
sp_OACreate | 建立 COM 物件實例,回傳物件 token (整數) |
sp_OADestroy | 釋放物件 token,必須成對呼叫 |
sp_OAGetProperty | 取得物件屬性值 |
sp_OASetProperty | 設定物件屬性值 |
sp_OAMethod | 呼叫物件方法,可傳參數、取回傳值 |
sp_OAGetErrorInfo | 取得上一個 COM 呼叫的詳細錯誤資訊 |
sp_OAStop | 停止目前連線的 OLE 自動化環境(罕用) |
NULL 佔位。HRESULT(int),0 成功,非零失敗。DECLARE @hr INT, @obj INT, @src VARCHAR(255), @desc VARCHAR(255);
EXEC @hr = sp_OACreate 'Scripting.FileSystemObject', @obj OUT;
IF @hr <> 0 BEGIN
EXEC sp_OAGetErrorInfo @obj, @src OUT, @desc OUT;
RAISERROR('COM Error: %s - %s', 16, 1, @src, @desc);
RETURN;
END
DECLARE @fs INT, @file INT, @hr INT, @txt VARCHAR(8000);
SET @txt = 'Hello from SQL Server ' + CONVERT(VARCHAR, GETDATE(), 120);
EXEC @hr = sp_OACreate 'Scripting.FileSystemObject', @fs OUT;
IF @hr = 0 EXEC @hr = sp_OAMethod @fs, 'CreateTextFile', @file OUT, 'C:\Temp\SQLLog.txt', TRUE, TRUE; -- overwrite, unicode
IF @hr = 0 EXEC @hr = sp_OAMethod @file, 'WriteLine', NULL, @txt;
IF @hr = 0 EXEC @hr = sp_OAMethod @file, 'Close', NULL;
IF @hr <> 0 EXEC sp_OAGetErrorInfo @fs, @src OUT, @desc OUT; -- 取錯誤細節
EXEC sp_OADestroy @file;
EXEC sp_OADestroy @fs;
sysadmin 權限執行,物件以 SQL Server 服務帳號身分執行,權限過高風險。sp_execute_external_script (R/Python)、Service Broker 非同步處理、外部應用層處理。歷史註記:SQL 6.5 稱 OLE Automation,SQL 7.0/2000 文件仍用「OLE」稱呼,實為 COM。線上叢書搜尋「OLE Automation」可找到完整參考。