web-dev-qa-db-ja.com

ファイルがフォルダに到着したときにSSISパッケージを実行する方法

要件は、SSISパッケージを実行することです。ファイルがフォルダーに到着したときに、パッケージを手動で開始したくありません。

ファイルの到着タイミングがわからない、またファイルが複数回到着する可能性があります。ファイルが到着するたびに、これをテーブルにロードする必要があります。ファイルウォッチャータスクなどのソリューションは、まだパッケージを開始することを期待しています。

9
user1254579

私が過去にこれを行った方法は、たとえば、SQLServerエージェントから呼び出された無限ループパッケージを使用することです。

これは私の無限ループパッケージです:

Simple Package

つの変数を設定:

IsFileExists-ブール値-0

FolderLocation-文字列-C:\ファイルが配置される場所\

IsFileExistsブール値-0

Forループコンテナーの場合:

For Loop Container

上記のようにIsFileExists変数を設定します。

ReadOnlyVariableをUser::FolderLocationとしてC#スクリプトタスクを設定し、次のようにします。

 public void Main()
    {
        int fileCount = 0;
        string[] FilesToProcess;
        while (fileCount == 0)
        {
            try
            {

                System.Threading.Thread.Sleep(10000);
                FilesToProcess = System.IO.Directory.GetFiles(Dts.Variables["FolderLocation"].Value.ToString(), "*.txt");
                fileCount = FilesToProcess.Length;

                if (fileCount != 0)
                {
                    for (int i = 0; i < fileCount; i++)
                    {
                        try
                        {

                            System.IO.FileStream fs = new System.IO.FileStream(FilesToProcess[i], System.IO.FileMode.Open);
                            fs.Close();

                        }
                        catch (System.IO.IOException ex)
                        {
                            fileCount = 0;
                            continue;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        // TODO: Add your code here
        Dts.TaskResult = (int)ScriptResults.Success;
    }
}
}

これにより、基本的に.txtファイルのフォルダーの場所を監視します。ファイルがない場合は、10秒間スリープします(必要に応じてこれを増やすことができます)。ファイルが存在する場合、ファイルは完了し、パッケージはロードパッケージを実行します。ただし、実行は継続されるため、次にファイルがドロップされたときに、ロードパッケージが再度実行されます。

この永久ループパッケージをSQLサーバーエージェントジョブとして実行して、常に実行されるようにしてください。同様のパッケージが実行されており、問題が発生することはありません。

また、入力パッケージがファイルをドロップフォルダーの場所から移動/アーカイブすることを確認してください。

9
Peter_R

他の人がすでに示唆しているように、WMIタスクまたは無限ループのいずれかを使用することはこれを達成するための2つのオプションですが、IMOSSISはリソースを大量に消費します。パッケージを常にバックグラウンドで実行させると、could大量のメモリ、CPUを消費し、実行している他のパッケージの数によっては、他のパッケージでパフォーマンスの問題が発生します。したがって、検討したい他のオプションは、5分または10分などごとにエージェントジョブをスケジュールし、ジョブ内のパッケージを呼び出すことです。ファイルが存在する場合にのみ続行するようにパッケージを構成するか、そうでない場合は終了します。

6
Samuel Vanga
2
Gustin

WMIを使用してファイルの到着を検出し、パッケージを起動するWindowsサービスを作成できます。方法の詳細はこちら: http://msbimentalist.wordpress.com/2012/04/27/trigger-ssis-package-when-files-available-in-a-folder-part2/?relatedposts_exclude = 3

2
TTeeple