DTS 套件觸發方式比較
| 方式 | 優點 | 缺點 |
| SQL Server Job + sp_start_job | 簡單、內建 | 非同步、無法直接取得成功/失敗狀態,需輪詢 sp_help_job |
| 用戶端載入 DTS DLL | 邏輯在用戶端 | 部署升級困難、版本衝突、安全性風險 |
| 伺服器端 sp_OA 呼叫 DTS COM 物件 | 同步執行、可取得傳回值、集中管理、避免用戶端部署 | 程式碼較複雜、需啟用 OLE Automation |
| VBScript 包裝後轉換 | 開發除錯容易 | 需轉換為 sp_OA 語法 |
核心實作流程:VBScript 先行原型 → sp_OA 轉換
1. VBScript 原型 (參考圖 A:DTS 物件庫參考)
' 需在專案加入參考:Microsoft DTSPackage Object Library
Dim pkg
Set pkg = CreateObject("DTS.Package")
pkg.LoadFromStorageFile _
"SQL Server", "ServerName", "User", "Pwd", _
DTSSStgFlag_Default, "", "", "", "PackageName", ""
pkg.Execute
' 檢查 pkg.ExecutionResult 判斷成敗
2. sp_OA 系統預存程序對應
sp_OACreate ↔ CreateObject:建立 COM 物件實例,傳回物件 Token (整數)。
sp_OAMethod ↔ 物件方法呼叫:EXEC sp_OAMethod @token, 'MethodName', @output OUT, param1, param2...
sp_OAGetProperty / sp_OASetProperty ↔ 讀寫屬性。
sp_OADestroy:釋放物件 Token。
3. T-SQL 完整範例:同步執行 DTS 套件並取得結果
DECLARE @hr INT, @pkgToken INT, @result INT, @errMsg VARCHAR(255);
-- 1. 建立 DTS.Package 物件
EXEC @hr = sp_OACreate 'DTS.Package', @pkgToken OUT;
IF @hr <> 0 GOTO ErrorHandler;
-- 2. 從 SQL Server 儲存載入套件
EXEC @hr = sp_OAMethod @pkgToken, 'LoadFromStorageFile', NULL,
'SQL Server', -- 來源類型
'MyServer', -- 伺服器名稱
'sa', -- 使用者
'password', -- 密碼
0, -- DTSSStgFlag_Default
'', '', '', -- 保留參數
'MyPackage', -- 套件名稱
''; -- 套件密碼 (無則空字串)
IF @hr <> 0 GOTO ErrorHandler;
-- 3. 執行套件
EXEC @hr = sp_OAMethod @pkgToken, 'Execute';
IF @hr <> 0 GOTO ErrorHandler;
-- 4. 取得執行結果
EXEC @hr = sp_OAGetProperty @pkgToken, 'ExecutionResult', @result OUT;
IF @hr <> 0 GOTO ErrorHandler;
-- 5. 釋放物件
EXEC sp_OADestroy @pkgToken;
-- 6. 判斷結果
IF @result = 1 -- DTSSExecResult_Success
PRINT 'DTS 套件執行成功';
ELSE
PRINT 'DTS 套件執行失敗,錯誤碼:' + CAST(@result AS VARCHAR);
RETURN;
ErrorHandler:
EXEC sp_OAGetErrorInfo @pkgToken, @errMsg OUT;
PRINT 'sp_OA 錯誤:' + ISNULL(@errMsg, '未知');
EXEC sp_OADestroy @pkgToken;
RETURN;
啟用條件與安全性
- 需啟用伺服器選項 Ole Automation Procedures:
sp_configure 'Ole Automation Procedures', 1; RECONFIGURE;
- 僅
sysadmin 可執行 sp_OA*,嚴格控制權限。
- DTS 套件儲存於 SQL Server (msdb) 或結構化儲存檔案,建議使用版本控管。
- SQL Server 2005+ 建議改用 SSIS +
dtutil / SSISDB 目錄部署與執行,DTS 已淘汰。