スクリプト タスクでの変数の使用
スクリプト タスクで変数を使用すると、パッケージ内の別のオブジェクトとデータを交換できます。 詳細については、「Integration Services (SSIS) の変数」を参照してください。
スクリプト タスクは、Dts オブジェクトの Variables プロパティを使用して、パッケージ内の Variable オブジェクトからデータを読み取ったり、オブジェクトにデータを書き込みます。
注 |
---|
Variable クラスの Value プロパティのデータ型は Object です。 スクリプト タスクでは Option Strict が有効なので、使用する前に、Value プロパティを適切な型にキャストする必要があります。 |
既存の変数は、[スクリプト タスク エディター] の ReadOnlyVariables の一覧および ReadWriteVariables の一覧に追加することにより、カスタム スクリプトで使用できるようになります。 変数名の大文字と小文字は区別されることに注意してください。 スクリプト内では、Dts オブジェクトの Variables プロパティを介して、両方の種類の変数にアクセスできます。 Value プロパティを使用して、各変数に対する読み取りおよび書き込みを行います。 スクリプト タスクは、スクリプトが変数の値を読み取ったり変更するときに、ユーザーに意識させずにロックを管理します。
Variables プロパティによって返される Variables コレクションの Contains メソッドを使用すると、変数をコードで使用する前に、その変数の存在を確認できます。
スクリプト タスクで変数を扱うには、VariableDispenser プロパティ (Dts.VariableDispenser) を使用することもできます。 VariableDispenser を使用する場合は、コード内で、ロック セマンティクスと、変数値のデータ型のキャストの両方を処理する必要があります。 デザイン時には使用できないが、実行時にプログラムによって生成される変数を扱う必要がある場合は、Variables プロパティではなく、VariableDispenser プロパティを使用する必要が生じる場合があります。
Foreach ループ コンテナー内でのスクリプト タスクの使用
Foreach ループ コンテナー内でスクリプト タスクを繰り返し実行する場合、そのスクリプトは通常、列挙子内の現在のアイテムの内容を処理する必要があります。 たとえば、Foreach File 列挙子を使用する場合、スクリプトは現在のファイル名を取得する必要があります。また、Foreach ADO 列挙子を使用する場合、スクリプトは現在のデータ行の列の内容を取得する必要があります。
変数を使用すると、Foreach ループ コンテナーとスクリプト タスク間のこうしたやり取りが可能になります。 [Foreach ループ エディター] の [変数のマッピング] ページでは、単一の列挙アイテムによって返されたデータの各アイテムに、変数が割り当てられます。 たとえば、Foreach File 列挙子の場合は、ファイル名のみがインデックス 0 で返されるためマッピングが必要な変数は 1 つのみですが、各行の複数のデータ列を返す列挙子の場合は、スクリプト タスクで使用する各列に、個別の変数をマップする必要があります。
列挙アイテムを変数にマップしたら、マップされた変数をスクリプトで使用できるように、[スクリプト タスク エディター] の [スクリプト] ページで、それらの変数を ReadOnlyVariables プロパティに追加する必要があります。 フォルダー内の画像ファイルを処理する Foreach ループ コンテナー内のスクリプト タスクの例については、「スクリプト タスクによる画像の操作」を参照してください。
変数の例
次の例では、スクリプト タスク内の変数にアクセスし、その変数を使用してパッケージ ワークフローのパスを決定する方法を示します。 このサンプルでは、CustomerCount および MaxRecordCount という名前の整数型の変数を作成し、[スクリプト タスク エディター] の ReadOnlyVariables コレクションに追加したものとします。 CustomerCount 変数には、インポートされる顧客レコード数が格納されます。 この値が MaxRecordCount の値よりも大きい場合、スクリプト タスクから失敗が報告されます。 MaxRecordCount のしきい値を超過したために失敗が発生した場合、ワークフローのエラー パスには、任意の必要なクリーンアップを実装できます。
サンプルを正常にコンパイルするには、Microsoft.SqlServer.ScriptTask アセンブリへの参照を追加する必要があります。
Public Sub Main()
Dim customerCount As Integer
Dim maxRecordCount As Integer
If Dts.Variables.Contains("CustomerCount") = True AndAlso _
Dts.Variables.Contains("MaxRecordCount") = True Then
customerCount = _
CType(Dts.Variables("CustomerCount").Value, Integer)
maxRecordCount = _
CType(Dts.Variables("MaxRecordCount").Value, Integer)
End If
If customerCount > maxRecordCount Then
Dts.TaskResult = ScriptResults.Failure
Else
Dts.TaskResult = ScriptResults.Success
End If
End Sub
using System;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
public class ScriptMain
{
public void Main()
{
int customerCount;
int maxRecordCount;
if (Dts.Variables.Contains("CustomerCount")==true&&Dts.Variables.Contains("MaxRecordCount")==true)
{
customerCount = (int) Dts.Variables["CustomerCount"].Value;
maxRecordCount = (int) Dts.Variables["MaxRecordCount"].Value;
}
if (customerCount>maxRecordCount)
{
Dts.TaskResult = (int)ScriptResults.Failure;
}
else
{
Dts.TaskResult = (int)ScriptResults.Success;
}
}
}
|