您目前已離線,請等候您的網際網路重新連線

INF:DTS 封裝開發、部署及效能

本文曾發行於 CHT242391
結論
本文的用途是提供詳細資訊,以協助「資料轉換服務」(DTS) 封裝的開發及部署。此外還包括了一些增進封裝效能的提示。
其他相關資訊

使資料連接更具彈性



DTS 封裝完全自成一個單位。所有連接資料都是在設計階段讀入連接屬性集合,甚至連 UDL 和 ODBC DSN 中的連接資訊也是如此。如果您在封裝建立後,變更 UDL 和 ODBC DSN,則該變更不會對封裝造成影響。將封裝從開發環境遷移至生產環境時,必須牢記這點。

使用 SQL Server 資料連接時,用本機來當作伺服器名稱,可使封裝在伺服器間較易移動,因為伺服器的名稱是在封裝執行時進行解析的。這個方法的缺點是,封裝必須在 SQL Server 電腦本身上執行及編輯。

您還可以使用 ActiveX 指令碼工作或包裝程式,在執行階段時修改封裝屬性。若要從封裝本身內部進行修改,請在資料幫浦工作之前建立「ActiveX 指令碼」工作,並在封裝執行時進行修改。若要取得封裝的控制代碼,請參考 DTSGlobalVariables.Parent。您可從這裡任意變更封裝屬性 (雖然需要一點程式設計的技巧)。

以下是《SQL 線上叢書》主題「ActiveX 指令碼工作」的範例,與如何使用 ActiveX 指令碼來變更 DataSource 連接屬性相關:
   Function main()   dim oPackage   dim oConn     'Get package object     set oPackage = DTSGlobalVariables.parent     'Get a handle to the desired connection.     set oConn = oPackage.connections(1)     'Modify the datasource.     oConn.datasource = "newServerName"     'Release object handles.     set oPackage = nothing     set oConn = nothing    Main = DTSTaskExecResult_SuccessEnd function
如果您想要有更多的控制權,而不在乎撰寫一些程式碼,請考慮在執行封裝前,用外部程式來修改封裝,或從頭開始自行建立封裝。

若要建立程式來載入並修改封裝,請用「DTS 精靈」或「DTS 設計師」來建立封裝範本,並加以儲存。請編寫 Visual Basic 程式來載入封裝並修改想要的屬性,然後呼叫封裝物件上的 Execute 方法來執行封裝。

若要建立程式來自行產生封裝,請用「DTS 精靈」或「DTS 設計師」來建立封裝原型,,並將其儲存到本機 SQL Server 中。請用下列「Microsoft 知識庫」文件中的 ScriptPkg 公用程式,建立封裝程式碼的範本:
239454 INF: ScriptPkg Tool Generates DTS Object Model Code to Help Use DTS Programmatically
請用這個範本當作參考,編寫您自己的程式碼,根據使用者輸入產生封裝。

請注意,前述兩個情況中的 Visual Basic 專案都需要參考「Microsoft DTSPackage 物件程式庫」。

重要:從以 Visual Basic 編寫的程式中執行封裝,並監視封裝或工作事件時,封裝中的所有步驟都一定要設定成在主執行緒上執行。這是因為 Visual Basic 具有一項限制,使其無法在事件得到多重的同時呼叫時,正確地加以處理。

用全域變數控制封裝



只有 ActiveX 指令碼工作、「工作流程」指令碼和 ActiveX 轉換,才能使用全域變數。全域變數無法直接用在 SQL 陳述式或連接屬性中,但是您可以使用 ActiveX 指令碼工作,來修改以全域變數為基礎的「SQL 陳述式」或連接屬性。以下是 ActiveX 指令碼工作的範例,以稱為 booktype 的全域變數來變更資料幫浦工作的「SQL 陳述式」:
Function Main()   dim oPackage   dim oPump        'Get a handle to the Package object.	set oPackage = DTSGlobalVariables.Parent	'Get a handle to the desired Datapump Task.	set oPump = oPackage.Tasks("DTSTask_DTSDataPumpTask_1").CustomTask   	'Alter the datapump SQL statement.	oPump.SourceSQLStatement = "select * from pubs..titles WHERE type _  = ''" + DTSGlobalVariables("booktype") + "''"	Main = DTSTaskExecResult_SuccessEnd Function
注意:工作的說明會顯示在「DTS 設計師」中,但該說明不能直接用來參考 ActiveX 指令碼中的工作。若要參考 ActiveX 指令碼的工作,應該使用工作的名稱。若要取得工作的名稱,請查閱步驟名稱的工作流程屬性。工作的名稱與步驟相同,只有 Step 會用 Task 來取代。例如:DTSStep_DTSDataPumpTask_1 會變成 DTSTask_DTSDataPumpTask_1。

傳遞參數至 DTS 封裝



DTSRun 程式不接受任何可以在執行階段傳遞給封裝的命令列參數。若要在執行階段時,將資訊傳遞給封裝,則必須從檔案讀取參數,或用程式設計的方式,從資料庫資料表查詢參數。

以下是「ActiveX 指令碼工作」的範例,此範例從文字檔讀取文字來設定全域變數。這個全域變數可以再用來修改封裝行為,如本文的〈用全域變數控制封裝〉一節中所述。
Function main()  Dim fso	'This will serve as a handle to a file system object.  Dim ofile	'Handle for accessing a file.    'Get a file system object for manipulation files.    Set fso = CreateObject("Scripting.FileSystemObject")    'Open the text file.    Set ofile = fso.OpenTextFile("c:\test.txt")    'Read line from the file into the global variable.    DTSGlobalVariables("myGlobalVar").Value = ofile.ReadLine    'Close the "parameter" file.    ofile.Close    Main = DTSTaskExecResult_SuccessEnd function
以下範例顯示如何使用「ActiveX 指令碼」工作,從 SQL Server 資料表讀取參數。該程式碼會讀取 my_param_table 中 paramvalue 欄位的值,並用它來設定全域變數。此範例使用「SQL 分散式管理物件」(DMO) 來與 SQL Server 互動,但您可以使用「ActiveX 資料物件」(ADO) 或其他的資料存取方法達到相同的目的。
Function main()Dim oServer 		'DMO Server object.Dim oResult		'Result set.Dim sParamValue	'Create a SQLDMO server object.	Set oServer =  CreateObject("SQLDMO.SQLServer")	' Make a connection to the local server.	oServer.Connect ".", "sa"	'Select the desired row from the table.	set oResult = oServer.Databases("pubs").ExecuteWithResults_("select  paramvalue from  my_param_table")	'Retrieve the first row, first column from the results.	sParamValue = oResult.GetColumnString (1,1)	'Set the global variable.	DTSGlobalVariables("MyGlobalVar").Value = sParamValue	Main = DTSTaskExecResult_SuccessEnd function

以 Visual Basic 編寫自訂的 DTS 工作



您可以用 Visual Basic 來編寫自訂的 DTS 工作。您可在 SQL Server 光碟的 \Devtools\Samples\DTS 目錄中,找到無介面的 Visual Basic 自定工作範例。以下是在 DTS 中處理自訂的 Visual Basic 工作時,可能會遇到的一些常見問題:
  1. 以 Visual Basic 編寫的、執行 DTS.CustomTaskUI MUST 之類介面的自定工作,必須執行介面中的每一個事件,否則便會造成「存取違規」。
  2. 如果您開發的 Visual Basic 自定工作具有介面,建議您最好套用 SQL Server Service Pack 1 (SP1)。SP1 整合了數項增強功能,可簡化介面的開發工作。
  3. 「Visual Basic 工作」具有 Apartment 執行緒,而 DTS 則沒有執行緒。為了執行以 Visual Basic 所寫成的工作,必須以主執行緒來執行該工作,否則便會造成「存取違規」。依預設值,DTS 會設定適當的旗標,使用者請勿變更這個旗標。

取得如何編寫 DTS 封裝程式碼的相關資訊



在 SQL 7.0 光碟片的 \Devtools\Damples\DTS 資料夾中有數個範例,這其中包括了「自定工作」(Visual Basic) 及「自訂轉換」(C++) 的範例。自解壓縮的可執行檔 DTSDemo.exe 中也包括了數個封裝範例。

用途最廣的範例是 ScriptPkg,它是 Dtsdemo.exe 的一部分。ScriptPkg 包含 Visual Basic 原始程式碼,可將儲存在本機伺服器的封裝轉換成 Visual Basic 程式碼。這個範例最適用下列用途:
  1. 透過編寫現有 DTS 封裝的指令碼,製造 Visual Basic 範例。
  2. 顯示如何編寫 DTS flatfile 驅動程式的程式碼,這項作業沒有記載在《SQL 線上叢書》中。
  3. 將封裝轉換成文字,以將其加入 SourceSafe 並加以追蹤。
以下是 ScriptPkg 範例的一些已知問題:
  1. 資料幫浦的查詢指令碼不正確。
  2. 如果封裝過大,則產生的文字就不能當成 Visual Basic 的一個函數,因為單一函數的行數有設限。您必須自行將指令碼檔案分成多個函數,Visual Basic 才能編譯程式碼。

增進 DTS 封裝效能



使用平行載入



DTS 可以平行地執行多項工作,但是 DTS 封裝中的每個連接一次都只能處理一個執行緒。這表示封裝中的下列資料幫浦都呈序列式:

A -> B 和 A -> B
A -> B 和 A -> C
A -> B 和 C -> B

無論您是否使用相同的圖示代表連接,都沒有差別。

唯一平行執行工作的方式,就是以不同的名稱,建立多個連接到相同的資料庫。例如 A -> B 和 C -> D 會平行地執行,就算 B 和 D 是到相同伺服器和資料庫的不同連接,也是如此。

您可以使用優先順序限制,強制執行工作順序,並在必要時避免選定的工作平行執行。

插入基本配置大小



資料幫浦工作最重要的參數是 Insert Commit Size (插入基本配置大小)。這項屬性只有在目的地是 SQL Server 時才有用,可用來控制在交易認可前,要大量地插入多少列。依預設值的量是 0,而所有的列都是單一交易的一部分。這是最安全的設定,因為只要發生錯誤,SQL Server 都可以復原所有變更。但是,這可能需要非常大的交易記錄檔;在取消封裝時,回應時間會拖得很長,而當載入大量資訊時,如果造成失敗的是最後那一列,更是使生產力更形降低。在認可資料列時,每個認可間隔結尾都會產生很明顯的停頓。基本配置大小為 0 時,速度最快,但次快的值分別為 10,000、1000 和 1。1 這個值很有用,因為失敗時只需復原一列。

請注意,如果插入基本配置大小為 0,則將錯誤計數設定為任何 > 1 的數目都不會有效果。錯誤計數是計算有錯誤的交易數,而不是資料列數。

DTS 與分散式交易



DTS 封裝為支援 DTC 的提供者提供分散式交易的支援。DTC 服務必須正在執行,封裝及步驟交易才可使用。此外,交易的每個提供者都必須支援 DTC。

封裝交易屬性是由封裝屬性的 [進階] 索引標籤來控制。

依預設值,封裝中的每個步驟都只控制自己的交易,而不會協調它在整個 DTC 過程中的交易。若要將工作列入 DTC 交易,您必須在工作的工作流程屬性中,設定 [如果存在,則聯結交易] 核取方塊。工作的其他 DTC 交易選項還有 [當這個步驟順利完成時認可交易] 以及 [失敗時將交易復原]。

請注意封裝不支援 Microsoft Transaction Server (MTS)。

錯誤訊息



當您使用某資料庫伺服器當作某封裝所連接的「本機」,而稍後又有人從另一台伺服器對該封裝進行編輯,且該人員想要查看所做的轉換時,便會出現下列的錯誤訊息:
Error Source : Microsoft OLE DB Provider for SQL ServerError Description : Cannot open database requested in login 'xxxxxxx'. Login fails."
(錯誤來源:Microsoft OLE DB Provider for SQL Server 錯誤說明:無法開啟登入者 'xxxxxxx' 所要求的資料庫。登入失敗。)
参考
本文件是根據 Microsoft Knowledgebase 文件編號 Q242391 翻譯的. 若要參考原始英文文件內容, 請至以下網址:

DTS, ActiveX, Data Transformation Services
內容

文章識別碼:242391 - 最後檢閱時間:03/11/2004 16:32:32 - 修訂: 2.1

  • Microsoft SQL Server 7.0 Standard Edition
  • Microsoft SQL Server 2000 Standard Edition
  • kbinfo KB242391
意見反應