[INF] DTS パッケージの開発と配布、およびパフォーマンスの向上

文書翻訳 文書翻訳
文書番号: 242391 - 対象製品
この記事は、以前は次の ID で公開されていました: JP242391
すべて展開する | すべて折りたたむ

目次

概要

この資料では、データ変換サービス (DTS) パッケージの開発と配布に役立つ詳細情報を紹介します。また、データ変換サービス パッケージのパフォーマンスを向上させるヒント情報も掲載しています。

詳細

データ接続に柔軟性をもたせる

DTS パッケージは、完全に独立したユニットです。UDL および ODBC DSN 内の接続情報も含め、すべての接続情報は設計時に接続プロパティ コレクションに読み込まれます。DTS パッケージの作成後に、ODBC DSN または OLEDB UDL を変更した場合、その変更内容は DTS パッケージに反映されません。パッケージを開発環境から実稼動環境に移行する際には、このことに注意してください。

SQL Server のデータ接続を使用する場合、サーバー名に (Local) を使用すると、パッケージの実行時にサーバー名の問題が解決されるため、サーバー間でパッケージをより簡単に移動できるようになります。ただし、このときパッケージを SQL Server コンピュータで実行しなければならないことに注意してください。

また、ActiveX スクリプト タスクやラッパー プログラムを使用して、実行時にパッケージ プロパティを変更することも可能です。パッケージをパッケージ自体で変更するには、データ ポンプ タスクの前に実行する ActiveX スクリプト タスクを作成し、ActiveX スクリプト タスクを実行させながらパッケージを変更します。パッケージのハンドルを取得するためには、DTSGlobalVariables.Parent を参照します。そこから、任意のパッケージ プロパティを変更できます。ただし、この場合、多少のプログラミング技術が必要になります。

以下に、SQL Books Online のトピック「ActiveX Script Tasks」にあるプログラム例を紹介します。ここでは、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_Success
End function
細かい制御を加える必要があり、さらにコードを記述する場合には、外部プログラムでパッケージを修正してからパッケージを実行するか、あるいは最初からパッケージを作成することを検討してください。

パッケージをロードし、変更するプログラムを作成するには、DTS ウィザードまたは DTS デザイナを使用してテンプレート パッケージを作成し、これを保存します。パッケージをロードし、必要なプロパティを変更する Visual Basic プログラムを記述し、パッケージを実行するためにパッケージ オブジェクト上で Execute メソッドを呼び出します。

最初からパッケージを生成するプログラムを作成するには、DTS ウィザードまたは DTS デザイナを使用してプロトタイプ パッケージを作成し、それをローカルの SQL Server に保存します。次に示す「サポート技術情報」 (Microsoft Knowledge Base) の資料にある ScriptPkg ユーティリティを使用して、パッケージ コードのテンプレートを作成してください。
239454 INF: ScriptPkg Tool Generates DTS Object Model Code to Help Use DTS Programmatically
239454 [SQL] INF: ScriptPkg ツールは DTS オブジェクト モデルのコードを生成する
参照としてこのテンプレートを使用し、ユーザー入力に基づいたパッケージを生成する独自のコードを記述してください。

ただし、前述した 2 つの状況においては、Visual Basic プロジェクトに Microsoft DTSPackage オブジェクト ライブラリへの参照を含める必要があります。

重要 : Visual Basic で記述したプログラムからパッケージを実行し、パッケージ イベントやタスク イベントを監視する場合、パッケージ内のすべてのステップをメイン スレッド上で実行するように構築する必要があります。これは、パッケージ イベントに対して同時発生する複数の呼び出しをパッケージが適切に処理できないという Visual Basic 上の制約によるものです。

グローバル変数によるパッケージの制御

グローバル変数は、ActiveX スクリプト タスク、Workflow スクリプト、ActiveX 変換からのみアクセスできます。SQL ステートメントや接続プロパティ内で直接グローバル変数を使用することはできません。ただし、ActiveX スクリプト タスクを使用して、グローバル変数を基に SQL ステートメントや接続プロパティを修正することができます。次の例は、booktype という名前のグルーバル変数に基づいて、データ ポンプ タスクの SQL ステートメントを変更するのに使用できる ActiveX スクリプト タスクです。
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_Success
End 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_Success
End function
次の例では、SQL Server テーブルからパラメータを読み込む ActiveX スクリプトの使用方法を示します。コードは、my_param_table 内の paramvalue 列の値を読み取り、この値を使用してグローバル変数を設定します。この例では、SQL 分散管理オブジェクト (SQL-DMO) を使用して SQL Server とデータをやり取りしていますが、ActiveX Data Objects (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_Success
End function

Visual Basic で DTS カスタム タスクを記述する

Visual Basic で DTS カスタム タスクを記述することができます。SQL Server CD-ROM の中にある \Devtools\Samples\DTS ディレクトリに、Visual Basic で記述したカスタム タスク例 (UI は未装備) が格納されています。ここで、DTS 内でカスタムの Visual Basic タスクを処理するときによく発生する問題をいくつか紹介します。
  1. DTS.CustomTaskUI のようなインターフェイスを実装するカスタム タスク (Visual Basic で記述) は、インターフェイス内のすべてのイベントを実装する必要があります。実装しなかった場合には、アクセス違反が発生します。
  2. UI を備えた Visual Basic カスタム タスクを開発する場合は、SQL Server Service Pack 1 (SP1) を使用することをお勧めします。SP1 には、UI の開発を支援する拡張機能が組み込まれています。
  3. DTS はフリー スレッドですが、Visual Basic タスクはアパートメント スレッドです。Visual Basic で記述されたタスクを実行するには、メイン スレッド上で実行する必要があります。そのようにしないと、アクセス違反が発生します。DTS は、既定で適切なフラグを設定します。このフラグは、ユーザーが変更することはできません。

DTS パッケージ コードの記述方法に関する情報の取得

SQL 7.0 では、CD-ROM 内の \Devtools\Damples\DTS フォルダにいくつかのコード例があります。その中には、カスタム タスク (Visual Basic) およびカスタム トランスフォーム (C++) のコード例が含まれています。また、自己解凍ファイル DTSDemo.exe 内にもパッケージ例がいくつか含まれています。

ScriptPkg は、最も汎用性の高いコード例です。これは Dtsdemo.exe に含まれています。ScriptPkg には、ローカル サーバーに保存されたパッケージを Visual Basic コードに変換する Visual Basic ソース コードが含まれています。この ScriptPkg は、以下を実行する際に有用です。
  1. 既存の DTS パッケージをスクリプト化することによって、Visual Basic サンプル コードを作成する。
  2. DTS フラットファイル ドライバ コードの記述方法を示す。SQL Books Online にはDTS フラットファイル ドライバに関する説明はありません。
  3. SourceSafe に追加および記録できるように、パッケージをテキストに変換する。
ScriptPkg 例には、すでに次のような問題があることが確認されています。
  1. 正しくスクリプト化されないデータ ポンプ用ルックアップ
  2. パッケージが大きくなりすぎると、生成されたテキストが Visual Basic の 1 つの関数では処理しきれなくなります。これは、1 つの関数内で処理可能な行数が制限されているためです。スクリプト ファイルを自分で複数の関数に分割し、Visual Basic でコードをコンパイルしなくてはなりません。

DTS パッケージのパフォーマンスの向上

パラレル ロードの使用

DTS は、並行して複数のタスクを実行できます。ただし、DTS パッケージ内の各接続は、同時に 1 つのスレッドしか処理できません。したがって、次のパッケージのデータ ポンプは、すべてシリアライズされます。

A -> B and A -> B
A -> B and A -> C
A -> B and C -> B

接続に対して同じアイコンを使用しても、あるいは別のアイコンを使用しても違いはありません。

タスクを並行して実行するには、同じデータベースへの複数の接続に対して異なる名前をつける以外に方法はありません。たとえば、A -> B と C -> D は、B と D が同一サーバーおよびデータベースに対する別々の接続であったとしても、並行して実行されます。

優先順位の制約を使用すると、強制的にタスクの実行順位を決定し、選択したタスクの並行処理を必要に応じて中止することができます。

挿入コミット サイズ

"挿入コミット サイズ" は、データ ポンプ タスク上最も重要なパラメータです。これは、挿入先が SQL Server である場合にのみ関係するプロパティです。このプロパティは、トランザクションをコミットする前に一括挿入する行数を制御します。この値は既定で 0 に設定されています。すべての行は、1 つのトランザクションに含まれます。エラーが発生すると、SQL Server はすべての変更をロールバックするので、この設定が最も安全です。ただし、このプロパティが膨大なトランザクション ログを必要とし、パッケージ取り消し時の応答時間が長くなり、さらに大規模なロードの最後の 1 行によってロード全体が失敗に終わってしまった場合、生産性という観点からは逆の結果を招くことになります。行をコミットすると、各コミット インターバルの終了時点に明瞭なポーズがあります。コミット サイズは 0 が最も高速ですが、他の適切な値は、速度の遅い順に 10,000、1000、1 となります。エラー発生時には 1 行だけがロールバックされるので、1 を指定しておくと便利です。

ただし、最大エラー数に任意の数値 > 1 を指定すると、挿入コミット サイズが 0 の場合は無効となる点に注意してください。最大エラー数は、行数ではなく、エラーのあるトランザクション数をカウントします。

DTS と分散トランザクション

DTS パッケージには、DTC をサポートするプロバイダの分散トランザクションがサポートされています。パッケージおよびステップ トランザクションに対して DTC サービスを実行する必要があります。さらに、トランザクション内の各プロバイダは DTC をサポートする必要があります。

パッケージ プロパティ トランザクション プロパティは、パッケージ プロパティの [詳細設定] タブで制御されます。

既定では、パッケージ内の各ステップによってパッケージ自身のトランザクションが処理されますが、DTC を介してパッケージ トランザクションの調整が行われることはありません。DTC トランザクション内にタスクを含めるには、タスクのワークフロー プロパティの [存在するトランザクションを結合] チェック ボックスを設定する必要があります。そのほか、タスク用 DTC トランザクションには、"このステップの正常終了時にトランザクションをコミットする" ためのオプションや "エラー発生時にトランザクションをロールバックする" ためのオプションがあります。

ただし、パッケージは Microsoft Transaction Server (MTS) をサポートしていないのでご注意ください。

エラー メッセージ

パッケージからデータベース サーバーに (local) を使用して接続し、その後パッケージを別のサーバーから編集して、そこから変換を参照しようとすると次のエラーが発生します。
エラー ソース : Microsoft OLE DB Provider for SQL Server エラーの説明 : ログイン 'xxxxxxx' で要求されたデータベースを開けません。ログインは失敗しました。"

関連情報

この資料は米国 Microsoft Corporation から提供されている Knowledge Base の Article ID 242391 (最終更新日 2000-10-25) をもとに作成したものです。

プロパティ

文書番号: 242391 - 最終更新日: 2004年3月3日 - リビジョン: 3.1
この資料は以下の製品について記述したものです。
  • Microsoft SQL Server 7.0 Standard Edition
  • Microsoft SQL Server 2000 Standard Edition
キーワード:?
kbinfo KB242391
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com