可能なオプション:
Execute SQL Task
を使用する代わりに、を使用してレコードセットをフェッチできますData Flow Task
。
例を示すSSIS2012パッケージ:
dbo.FileNames
データデータベースにいくつかのサンプル行を含む名前付きのテーブルがあると仮定します。
テーブルスクリプトを作成して入力します。
CREATE TABLE dbo.FileNames(
srcPath nvarchar(255) NULL,
srcName nvarchar(60) NULL
);
GO
INSERT INTO dbo.FileNames (srcPath, srcName) VALUES
('C:\temp', 'File_1.txt')
, ('C:\temp', 'File_2.txt')
, ('C:\temp', 'File_3.txt')
;
GO
以下に示すように、[制御フロー]タブを構成します。を配置しExecute SQL Task
てテーブルデータを読み取り、オブジェクトデータ型に格納します。Foreach Loop Container
SQL実行タスクの後にaを配置し、Foreachループコンテナ内にaを配置しScript Task
ます
次の変数を作成します。パスに末尾の円記号がない場合は、それに応じてパスとファイル名の間に追加されるよう@[User::srcPath] + "\\" + @[User::srcFile]
に、変数で式を使用することをお勧めします。srcFull
Variable name Scope Data type Expression
-------------- ------------- ---------- -----------
FileNames SO_15072939 Object
srcFile SO_15072939 String
srcFull SO_15072939 String @[User::srcPath] + "\\" + @[User::srcFile]
srcPath SO_15072939 String
SQL実行タスクを構成して、接続マネージャーに対して以下のクエリを実行し、ファイルパスと名前の情報を読み取ります。
SELECT srcPath, srcName FROM dbo.FileNames
FileNames
クエリによって返される結果セットは、データ型の変数に格納する必要がありますObject
。
を使用しForeach Loop Container
て変数FileNamesを読み取るようにを構成しForeach ADO Enumerator
ます。
結果セットがループスルーされるときに列値を格納するように2つのパッケージ変数を構成します。
変数を読み取るようにスクリプトタスクエディタを構成しますsrcFull
以下のコードをスクリプトタスクに追加します。
SSIS 2008以降のC#でのスクリプトタスクコード:
#region Namespaces
using System;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;
using System.IO;
#endregion
namespace ST_f1d7b6ab42e24ad5b5531684ecdcae87
{
[Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute]
public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
{
public void Main()
{
string filePath = Dts.Variables["User::srcFull"].Value.ToString();
MessageBox.Show(filePath);
Dts.TaskResult = File.Exists(filePath)
? (int)ScriptResults.Success
: (int)ScriptResults.Failure;
}
#region ScriptResults declaration
enum ScriptResults
{
Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
};
#endregion
}
}
パッケージを実行すると、変数値がに表示されMessageBox
ます。
C:\temp\File_1.txt
パスが存在しないため、このサンプルではパッケージが失敗します。
OPのコメントへの回答:
私はあなたがここに示していることをしました、私の問題は、User :: srcFile変数がReadWriteVariablesとしてスクリプトタスクに追加されているので(同じスクリプトでいくつかのことをする必要があるため)、ちょっとロックされているようですしたがって、定義が@ [User :: srcPath] + @ [User::srcFile]であるUser::srcFull変数は評価できません。
スクリプトタスクエディタで変数srcFull
をからReadOnlyVariables
に変更しましたが、式は引き続き正しく評価されました。サンプル入力でこれらの3つのファイルを作成し、パッケージはメッセージボックスに各パスを正しく表示し、正常に実行を完了しました。ReadWriteVariables
スクリプトタスクとForeachループコンテナの両方が同じ変数を更新しようとしているため、変数srcPath
とスクリプトタスクエディタsrcFile
のセクションに追加すると、競合が発生するだけです。ReadWriteVariables