1. 目標 MS SQL Server做大數據量傳輸的時候,我們大多會用到數據傳輸服務。現在假設,在開發環境下,我們已經設計好了DTS包並且運行良好,接下來我們要做的事情是遷移和部署這個DTS數據包。
所以,我們需要把設計環境下的DTS包保存成結構化的存儲文件,並且這個文件導入到目標環境下的MS SQL Server中,最後添加作業,讓MS SQL Server Angent在我們預期的事情執行這個DTS包完成數據傳輸工作。其中需要重點解決的一個問題是,在目標環境中,DTS傳輸的源和目的地會發生改變,需要對它進行配置。
2. 解決方案 2.1. DTSRun
DTSRun是微軟提供的命令用於執行DTS包(包括結構化存儲的、存儲在SQL Server或存儲在Meta Data Services的包)。
dtsrun的用法:
dtsrun
[/?]|
[
[
/[~]S server_name[instance_name]
{ {/[~]U user_name [/[~]P passWord]} | /E }
]
{
{/[~]N package_name }
| {/[~]G package_guid_string}
| {/[~]V package_version_guid_string}
}
[/[~]M package_passWord]
[/[~]F filename]
[/[~]R repository_database_name]
[/A global_variable_name:typeid=value]
[/L log_file_name]
[/W NT_event_log_completion_status]
[/Z] [/!X] [/!D] [/!Y] [/!C]
]
具體的用法參看微軟的資料。這裡需要重點指出的是,通過“/A global_variable_name:typeid=value”選項,我們可以給DTS包傳遞多個自定義的參數,在DTS包部署的目標環境下,我們用這個選項告訴DTS包服務器名稱、用戶名、密碼等數據庫連接信息。通過“/!Y”選項可以獲取加密後的DTSRun參數。
2.2. 重新設計DTS包
為了處理DTSRun傳入的自定義參數,DTS包需要重新設計。我們可以增加一個ActiveX Script任務,在ActiveX Script任務中通過VB Script或者Java Script對DTS編程,並且定義流程,把ActiveX Script任務設置成最開始的一個任務。由於DTS COM對象線程模式與ActiveX Script任務宿主的不一致,需要將ActiveX Script任務工作流屬性設置成在主包線程中執行,否則可能會出現調用錯誤。
下面的例子是ActiveX Script任務中的腳本。例子中的DTS包包含名稱為"DBConnection"的數據庫連接對象。
'************************************************************************
' Visual Basic ActiveX Script
'************************************************************************
Function Main()
Dim sDBDataSource
Dim sDBCatalog
Dim sDBUserID
Dim sDBPassWord
Dim bDBUseTrusted
Dim sOLAPServer
Dim sOLAPCatalog
Dim oPackage
Dim oConnection
Dim oTask
Dim oCustomTask
' 獲取DTSRun傳入的自定義參數
sDBDataSource = DTSGlobalVariables("DBDataSource").Value
sDBCatalog = DTSGlobalVariables("DBCatalog").Value
sDBUserID = DTSGlobalVariables("DBUserID").Value
sDBPassWord = DTSGlobalVariabl