次の方法で共有


リモート コンピューターでのプログラムによる SSIS パッケージの実行

クライアント (ローカル) コンピューターで、Integration Services がインストールされていない場合、またはパッケージに必要なリソースがすべて利用できるわけではない場合、パッケージの保存先であるリモート コンピューター上でパッケージが実行されるように、パッケージを起動する必要があります。パッケージをリモート コンピューター上で確実に実行できるようにするには、追加のステップが必要になります。これは、パッケージが、パッケージを起動するアプリケーションと同じコンピューター上で実行されるためです。つまり、ローカル コンピューター上のアプリケーションからリモート パッケージを直接実行すると、パッケージはローカル コンピューターから読み込まれ、実行されます。ローカル コンピューターで、Integration Services がインストールされていないか、またはパッケージに必要なリソースをすべて利用できるわけではない場合、パッケージは正常に実行されません。

注意

SQL Server ライセンス供与の条件により、Integration Services を追加のコンピューターにインストールできないので、クライアント コンピューターに Integration Services がインストールされていないことがあります (Integration Services はサーバー コンポーネントであるため、クライアント コンピューターに再配布できません)。ただし、ローカル コンピューターに Integration Services がインストールしてあり、パッケージが必要とするすべてのリソースを利用できる場合には、ローカル コンピューターを使用してリモート パッケージを実行することができます。詳細については、「ローカル コンピューターでのプログラムによる SSIS パッケージの実行」を参照してください。

リモート コンピューター上のパッケージを起動するには、次のプログラムのいずれかを呼び出します。

  • SQL Server エージェント

  • リモート コンピューター上で実行されている別のアプリケーション、コンポーネント、または Web サービス

このトピックのセクション

  • リモート コンピューターの前提条件

  • SQL Server エージェントの呼び出しによるパッケージのリモート実行

  • リモート コンポーネントまたはリモート サービスの呼び出しによるパッケージのリモート実行

リモート コンピューターの前提条件

リモート コンピューター上でパッケージを実行するプロセスが、必要な権限を保有していることを確認する必要があります。このプロセスで権限が必要とされるのは、パッケージを起動するためだけではなく、パッケージが使用するリソースすべてを見つけて開くためでもあります。既定の権限では不十分な場合もあります (特に、Web ベースのソリューションの場合)。権限、および認証と承認については、このトピックでは説明しません。

多くの場合、別のアカウントを借用してパッケージを実行しても、適切には実行されません。パッケージが借用アカウントで起動しても、パッケージによって作成された追加スレッドは、パッケージを起動したプロセスによって使用されるアカウントに帰属します。このようなスレッドとしては、データの読み込みと保存のためにデータ フローで使用されるスレッドがあります。つまり、プロセス アカウント自体が、パッケージによって使用されるほとんどの外部リソースに対する権限を必要とします。

SQL Server エージェントの呼び出しによる SSIS パッケージのリモート実行

次のサンプル コードでは、プログラムで SQL Server エージェントを呼び出して、リモート コンピューター上でパッケージを実行する方法を示します。このサンプル コードでは、sp_start_job システム ストアド プロシージャを呼び出します。このストアド プロシージャは、リモート コンピューター上にある RunSSISPackage という名前の SQL Server エージェント ジョブを開始します。その後、RunSSISPackage ジョブにより、ジョブ自体が実行されているリモート コンピューターでパッケージが実行されます。

注意

sp_start_job ストアド プロシージャの戻り値は、このストアド プロシージャが SQL Server エージェント ジョブを正常に開始できたかどうかを示します。この戻り値は、パッケージが成功したか失敗したかを示しません。

SQL Server エージェントのジョブから実行されるパッケージのトラブルシューティングについては、Microsoft の記事「SQL Server エージェント ジョブ ステップから SSIS パッケージを呼び出すと、SSIS パッケージは実行されません。」を参照してください。

サンプル コード

次のコード サンプルでは、System.Data アセンブリへの参照が必要です。

Imports System.Data
Imports System.Data.SqlClient

Module Module1

  Sub Main()

    Dim jobConnection As SqlConnection
    Dim jobCommand As SqlCommand
    Dim jobReturnValue As SqlParameter
    Dim jobParameter As SqlParameter
    Dim jobResult As Integer

    jobConnection = New SqlConnection("Data Source=(local);Initial Catalog=msdb;Integrated Security=SSPI")
    jobCommand = New SqlCommand("sp_start_job", jobConnection)
    jobCommand.CommandType = CommandType.StoredProcedure

    jobReturnValue = New SqlParameter("@RETURN_VALUE", SqlDbType.Int)
    jobReturnValue.Direction = ParameterDirection.ReturnValue
    jobCommand.Parameters.Add(jobReturnValue)

    jobParameter = New SqlParameter("@job_name", SqlDbType.VarChar)
    jobParameter.Direction = ParameterDirection.Input
    jobCommand.Parameters.Add(jobParameter)
    jobParameter.Value = "RunSSISPackage"

    jobConnection.Open()
    jobCommand.ExecuteNonQuery()
    jobResult = DirectCast(jobCommand.Parameters("@RETURN_VALUE").Value, Integer)
    jobConnection.Close()

    Select Case jobResult
      Case 0
        Console.WriteLine("SQL Server Agent job, RunSISSPackage, started successfully.")
      Case Else
        Console.WriteLine("SQL Server Agent job, RunSISSPackage, failed to start.")
    End Select
    Console.Read()

  End Sub

End Module
using System;
using System.Data;
using System.Data.SqlClient;

namespace LaunchSSISPackageAgent_CS
{
  class Program
  {
    static void Main(string[] args)
    {
      SqlConnection jobConnection;
      SqlCommand jobCommand;
      SqlParameter jobReturnValue;
      SqlParameter jobParameter;
      int jobResult;

      jobConnection = new SqlConnection("Data Source=(local);Initial Catalog=msdb;Integrated Security=SSPI");
      jobCommand = new SqlCommand("sp_start_job", jobConnection);
      jobCommand.CommandType = CommandType.StoredProcedure;

      jobReturnValue = new SqlParameter("@RETURN_VALUE", SqlDbType.Int);
      jobReturnValue.Direction = ParameterDirection.ReturnValue;
      jobCommand.Parameters.Add(jobReturnValue);

      jobParameter = new SqlParameter("@job_name", SqlDbType.VarChar);
      jobParameter.Direction = ParameterDirection.Input;
      jobCommand.Parameters.Add(jobParameter);
      jobParameter.Value = "RunSSISPackage";

      jobConnection.Open();
      jobCommand.ExecuteNonQuery();
      jobResult = (Int32)jobCommand.Parameters["@RETURN_VALUE"].Value;
      jobConnection.Close();

      switch (jobResult)
      {
        case 0:
          Console.WriteLine("SQL Server Agent job, RunSISSPackage, started successfully.");
          break;
        default:
          Console.WriteLine("SQL Server Agent job, RunSISSPackage, failed to start.");
          break;
      }
      Console.Read();
    }
  }
}

トップに戻る

リモート コンポーネントまたはリモート サービスの呼び出しによる SSIS パッケージのリモート実行

前のセクションで、リモート コンピューター上でプログラムによってパッケージを実行するためのソリューションでは、リモート コンピューター上にカスタム コードを用意する必要はありません。ただし、SQL Server エージェントに依存せずにパッケージを実行するソリューションが適切である場合もあります。

次の例では、Integration Services パッケージをリモート コンピューター上で起動するためにリモート コンポーネントまたはサーバー上の Web サービスで使用できるコードの一部を示します。

サンプル コード

次のコード サンプルでは、パッケージをリモートで実行するリモート クラスを作成してテストするための方法が示されています。これらのサンプルは完成版ではなく、リモート コンポーネントまたは Web サービスとして構築されたソリューションの一部として使用できるコードを示しています。

これらのサンプルでは、Microsoft.SqlServer.ManagedDTS アセンブリへの参照が必要です。

SSIS パッケージをリモートで実行する関数の作成

Integration Services パッケージは、ファイルや SQL Server から直接読み込んだり、SSIS パッケージ ストアから読み込んだりすることができます。SSIS パッケージ ストアは、SQL Server および特別なファイル システム フォルダー内のパッケージ ストレージを管理します。読み込みオプションをすべてサポートするために、このサンプルでは Select Case コンストラクトまたは switch コンストラクトを使用して、パッケージを起動するための適切な構文を選択し、入力引数を適切に連結します。

重要な注意事項重要

SSIS パッケージ ストアを操作するための Application クラスのメソッドは、"."、localhost、またはローカル サーバーのサーバー名のみをサポートします。"(local)" は使用できません。

LaunchPackage メソッドは、パッケージの実行結果を DTSExecResult 値ではなく、整数として返します。これは、クライアント コンピューターで Integration Services アセンブリへの参照が不要になるようにするためです。

重要な注意事項重要

このサンプルは完成版ではなく、リモート コンポーネントまたは Web サービスとして構築されたソリューションの一部として使用できるコードを示しています。サンプルには、コード、属性、および参照は含まれません。これらは、リモートのコンポーネントまたはサービスの構築および公開で必要となる場合があります。

プログラムによってサーバー上でパッケージを実行するためのリモート クラスを作成するには

  1. Visual Studio を開き、任意のプログラミング言語で適切な種類のプロジェクトを作成します。

    次のサンプル コードでは、プロジェクトに LaunchSSISPackageService という名前を使用します。

  2. Microsoft.SqlServer.ManagedDTS アセンブリへの参照を追加します。

  3. サンプル コードをクラス ファイルに貼り付けます。

    このサンプルはコード ウィンドウの内容全体を表しています。

  4. リモートのコンポーネントまたはサービスの構築や公開で必要となるコード、属性、参照を追加します。

  5. サンプル コードを内蔵するプロジェクトをビルドしてテストします。

Imports Microsoft.SqlServer.Dts.Runtime
Imports System.IO

Public Class LaunchSSISPackageService

  ' LaunchPackage Method Parameters:
  ' 1. sourceType: file, sql, dts
  ' 2. sourceLocation: file system folder, (none), logical folder
  ' 3. packageName: for file system, ".dtsx" extension is appended

  Public Function LaunchPackage( _
    ByVal sourceType As String, _
    ByVal sourceLocation As String, _
    ByVal packageName As String) As Integer 'DTSExecResult

    Dim packagePath As String
    Dim myPackage As Package
    Dim integrationServices As New Application

    ' Combine path and file name.
    packagePath = Path.Combine(sourceLocation, packageName)

    Select Case sourceType
      Case "file"
        ' Package is stored as a file.
        ' Add extension if not present.
        If String.IsNullOrEmpty(Path.GetExtension(packagePath)) Then
          packagePath = String.Concat(packagePath, ".dtsx")
        End If
        If File.Exists(packagePath) Then
          myPackage = integrationServices.LoadPackage(packagePath, Nothing)
        Else
          Throw New ApplicationException( _
            "Invalid file location: " & packagePath)
        End If
      Case "sql"
        ' Package is stored in MSDB.
        ' Combine logical path and package name.
        If integrationServices.ExistsOnSqlServer(packagePath, ".", String.Empty, String.Empty) Then
          myPackage = integrationServices.LoadFromSqlServer( _
            packageName, "(local)", String.Empty, String.Empty, Nothing)
        Else
          Throw New ApplicationException( _
            "Invalid package name or location: " & packagePath)
        End If
      Case "dts"
        ' Package is managed by SSIS Package Store.
        ' Default logical paths are File System and MSDB.
        If integrationServices.ExistsOnDtsServer(packagePath, ".") Then
          myPackage = integrationServices.LoadFromDtsServer(packagePath, "localhost", Nothing)
        Else
          Throw New ApplicationException( _
            "Invalid package name or location: " & packagePath)
        End If
      Case Else
        Throw New ApplicationException( _
          "Invalid sourceType argument: valid values are 'file', 'sql', and 'dts'.")
    End Select

    Return myPackage.Execute()

  End Function

End Class
using Microsoft.SqlServer.Dts.Runtime;
using System.IO;

public class LaunchSSISPackageServiceCS
{
  public LaunchSSISPackageServiceCS()
  {
    }

  // LaunchPackage Method Parameters:
  // 1. sourceType: file, sql, dts
  // 2. sourceLocation: file system folder, (none), logical folder
  // 3. packageName: for file system, ".dtsx" extension is appended

  public int LaunchPackage(string sourceType, string sourceLocation, string packageName)
  { 

    string packagePath;
    Package myPackage;
    Application integrationServices = new Application();

    // Combine path and file name.
    packagePath = Path.Combine(sourceLocation, packageName);

    switch(sourceType)
    {
      case "file":
        // Package is stored as a file.
        // Add extension if not present.
        if (String.IsNullOrEmpty(Path.GetExtension(packagePath)))
        {
          packagePath = String.Concat(packagePath, ".dtsx");
        }
        if (File.Exists(packagePath))
        {
          myPackage = integrationServices.LoadPackage(packagePath, null);
        }
        else
        {
          throw new ApplicationException("Invalid file location: "+packagePath);
        }
        break;
      case "sql":
        // Package is stored in MSDB.
        // Combine logical path and package name.
        if (integrationServices.ExistsOnSqlServer(packagePath, ".", String.Empty, String.Empty))
        {
          myPackage = integrationServices.LoadFromSqlServer(packageName, "(local)", String.Empty, String.Empty, null);
        }
        else
        {
          throw new ApplicationException("Invalid package name or location: "+packagePath);
        }
        break;
      case "dts":
        // Package is managed by SSIS Package Store.
        // Default logical paths are File System and MSDB.
        if (integrationServices.ExistsOnDtsServer(packagePath, "."))
        {
          myPackage = integrationServices.LoadFromDtsServer(packagePath, "localhost", null);
        }
        else
        {
          throw new ApplicationException("Invalid package name or location: "+packagePath);
        }
        break;
      default:
        throw new ApplicationException("Invalid sourceType argument: valid values are 'file', 'sql', and 'dts'.");
    }

    return (Int32)myPackage.Execute();

  }

}

SSIS パッケージをリモートで実行する関数の呼び出し

次のサンプル コンソール アプリケーションでは、リモートのコンポーネントまたはサービスを使用してパッケージを実行します。

リモート クラスの LaunchPackage メソッドは、パッケージの実行結果を DTSExecResult 値ではなく、整数として返します。これは、クライアント コンピューターで任意の Integration Services アセンブリへの参照が不要になるようにするためです。このサンプルでは、実行結果を報告するために、DTSExecResult 値を反映する値を持つプライベート列挙を作成します。

リモート クラスをテストするためのコンソール アプリケーションを作成するには

  1. Visual Studio で、任意のプログラミング言語を使用して新しいコンソール アプリケーションを作成します。

    同じコードで、プロジェクトに LaunchSSISPackageTest という名前を使用します。

  2. リモートのコンポーネントまたはサービスを表すローカル プロキシ アセンブリへの参照を追加します。必要に応じて、プロキシ オブジェクトに割り当てた名前に合わせて、サンプル コードの変数宣言を調整します。

  3. Main ルーチンとプライベート列挙のサンプル コードをコードに貼り付けます。

    このサンプルはコード ウィンドウの内容全体を表しています。

  4. LaunchPackage メソッドを呼び出すコード行を編集し、入力引数に既存のパッケージを指す一連の有効な値を指定します。

    たとえば、package1.dtsx がサーバーの C:\My Packages に格納されている場合、sourceType の値として "file"、sourceLocation の値として "C:\My Packages"、packageName の値として "package1" (拡張子なし) を渡します。

Module LaunchSSISPackageTest

  Sub Main()

    Dim launchPackageService As New LaunchSSISPackageService.LaunchSSISPackageService
    Dim packageResult As Integer

    Try
      packageResult = launchPackageService.LaunchPackage("sql", String.Empty, "SimpleTestPackage")
    Catch ex As Exception
      Console.WriteLine("The following exception occurred: " & ex.Message)
    End Try

    Console.WriteLine(CType(packageResult, PackageExecutionResult).ToString)
    Console.ReadKey()

  End Sub

  Private Enum PackageExecutionResult
    PackageSucceeded
    PackageFailed
    PackageCompleted
    PackageWasCancelled
  End Enum

End Module
using System;

namespace LaunchSSISPackageSvcTestCS
{
  class Program
  {
    static void Main(string[] args)
    {
      LaunchSSISPackageServiceCS.LaunchSSISPackageServiceCS launchPackageService = new LaunchSSISPackageServiceCS.LaunchSSISPackageServiceCS();
      int packageResult = 0;

      try
      {
        packageResult = launchPackageService.LaunchPackage("sql", String.Empty, "SimpleTestPackage");
      }
      catch (Exception ex)
      {
        Console.WriteLine("The following exception occurred: " + ex.Message);
      }

      Console.WriteLine(((PackageExecutionResult)packageResult).ToString());
      Console.ReadKey();

    }

    private enum PackageExecutionResult
    {
      PackageSucceeded,
      PackageFailed,
      PackageCompleted,
      PackageWasCancelled
    };

  }
}

トップに戻る

外部リソース

Integration Services のアイコン (小) 最新の Integration Services の入手

マイクロソフトが提供する最新のダウンロード、記事、サンプル、ビデオ、およびコミュニティで選択されたソリューションについては、MSDN の Integration Services のページを参照してください。


これらの更新が自動で通知されるようにするには、ページの RSS フィードを定期受信します。