プログラムによるリモート パッケージの読み込みと実行

新規 : 2006 年 4 月 14 日

Integration Services がインストールされていないローカル コンピュータからリモート パッケージを実行するには、Integration Services がインストールされているリモート コンピュータ上でパッケージが実行されるように、パッケージを起動する必要があります。それには、ローカル コンピュータで SQL Server エージェント、Web サービス、またはリモート コンポーネントを使用して、リモート コンピュータ上のパッケージを起動します。リモート パッケージをローカル コンピュータから直接起動すると、パッケージはローカル コンピュータに読み込まれ、ローカル コンピュータから実行されます。ローカル コンピュータに Integration Services がインストールされていない場合、パッケージは実行されません。

ms403355.note(ja-jp,SQL.90).gifメモ :
Integration Services がインストールされていないクライアント コンピュータでは、パッケージを BI Development Studio の外部で実行することはできません。また SQL Server 2005 ライセンスの条件により、Integration Services を他のコンピュータにインストールできない場合があります。SQL Server 2005 Integration Services (SSIS) はサーバー コンポーネントであり、クライアント コンピュータに再配布することはできません。

また、Integration Services がインストールされているローカル コンピュータからリモート パッケージを実行することもできます。詳細については、「プログラムによるローカル パッケージの読み込みと実行」を参照してください。

リモート コンピュータ上でのリモート パッケージの実行

既に説明したように、リモート サーバー上でリモート パッケージを実行する方法はいくつかあります。

  • SQL Server エージェントを使用し、プログラムによってリモート パッケージを実行する。
  • Web サービスまたはリモート コンポーネントを使用し、プログラムによってリモート パッケージを実行する。

このトピックでパッケージを読み込み、保存するために使用するほとんどすべてのメソッドには、Microsoft.SqlServer.ManagedDTS アセンブリへの参照が必要です。例外は、このトピックで示す sp_start_job ストアド プロシージャを実行するための ADO.NET の方法です。この方法では、System.Data への参照のみが必要です。新しいプロジェクトに Microsoft.SqlServer.ManagedDTS アセンブリへの参照を追加した後、using または Imports ステートメントを使用して Microsoft.SqlServer.Dts.Runtime 名前空間をインポートします。

SQL Server エージェントを使用した、サーバー上でのプログラムによるリモート パッケージの実行

SQL Server エージェントをプログラムで使用して、サーバー上でリモート パッケージを実行する方法を次のサンプル コードに示します。このサンプル コードでは、システム ストアド プロシージャ sp_start_job を呼び出します。このストアド プロシージャは、SQL Server エージェント ジョブを起動します。このストアド プロシージャが起動するジョブは、RunSSISPackage という名前で、リモート コンピュータ上に存在します。RunSSISPackage ジョブは、リモート コンピュータ上のパッケージを実行します。

ms403355.note(ja-jp,SQL.90).gifメモ :
sp_start_job ストアド プロシージャの戻り値は、このストアド プロシージャが SQL Server エージェント ジョブを適切に起動できたかどうかを示します。この戻り値は、パッケージが成功したか失敗したかは示しません。

SQL Server エージェント ジョブから実行されるパッケージのトラブルシューティングの詳細については、サポート技術情報の資料「SQL Server エージェント ジョブ ステップから SSIS パッケージを呼び出すとき、SSIS パッケージが実行されません。」を参照してください。

サンプル コード

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();
    }
  }
}

トップに戻る

Web サービスまたはリモート コンポーネントを使用した、プログラムによるリモート パッケージの実行

上記のサーバー上でプログラムによってパッケージを実行するためのソリューションでは、サーバー上にカスタム コードを用意する必要はありません。ただし、SQL Server エージェントに依存せずにパッケージを実行するソリューションが好ましいこともあります。次の例では、Integration Services パッケージをローカルで起動するためにサーバー上で作成できる Web サービスと、この Web サービスをクライアント コンピュータから呼び出すために使用できるテスト アプリケーションを示します。Web サービスではなくリモート コンポーネントを作成する場合は、同じコード ロジックを、ほとんど変更せずにリモート コンポーネントで使用できます。ただし、リモート コンポーネントを使用する場合は、Web サービスよりも広範な設定が必要になることがあります。

ms403355.note(ja-jp,SQL.90).gif重要 :
認証および承認が既定の設定である場合、Web サービスには一般に SQL Server またはファイル システムにアクセスしてパッケージを読み込み、実行するための十分な権限がありません。web.config ファイルで認証と承認の設定を構成し、データベース権限およびファイル システム権限を適切に割り当てることにより、Web サービスに適切な権限を割り当てる必要があります。Web、データベース、およびファイル システムの権限の詳細については、このトピックでは説明しません。
ms403355.note(ja-jp,SQL.90).gif重要 :
SSIS パッケージ ストアを操作するための Application クラスのメソッドは、"."、localhost、またはローカル サーバーのサーバー名のみをサポートします。"(local)" は使用できません。

サンプル コード

次のサンプル コードは、Web サービスを作成しテストする方法を示しています。

Web サービスの作成

Integration Services パッケージは、ファイルや SQL Server から直接読み込んだり、SSIS パッケージ ストアから読み込んだりすることができます。SSIS パッケージ ストアは、SQL Server および特別なファイル システム フォルダ内のパッケージ ストレージを管理します。このサンプルは、Select Case コンストラクトまたは switch コンストラクトを使用してパッケージを起動するための適切な構文を選択し、入力引数を適切に連結することで、すべての使用可能なオプションをサポートしています。LaunchPackage Web サービス メソッドは、クライアント コンピュータで Integration Services アセンブリへの参照が不要になるように、パッケージの実行結果を DTSExecResult 値ではなく、整数として返します。

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

  1. Visual Studio を開き、任意のプログラミング言語で Web サービス プロジェクトを作成します。サンプル コードでは、プロジェクトに LaunchSSISPackageService という名前を使用します。

  2. Microsoft.SqlServer.ManagedDTS への参照を追加し、コード ファイルに Microsoft.SqlServer.Dts.Runtime 名前空間のための Imports ステートメントまたは using ステートメントを追加します。

  3. LaunchPackage Web サービス メソッドのサンプル コードをクラスに貼り付けます (このサンプルはコード ウィンドウの内容全体を表しています)。

  4. LaunchPackage メソッドの入力引数に既存のパッケージを指し示す一連の有効な値を指定することにより、Web サービスをビルドしてテストします。たとえば、package1.dtsx がサーバーの C:\My Packages に格納されている場合、sourceType の値として "file"、sourceLocation の値として "C:\My Packages"、packageName の値として "package1" (拡張子なし) を渡します。

Imports System.Web
Imports System.Web.Services
Imports System.Web.Services.Protocols
Imports Microsoft.SqlServer.Dts.Runtime
Imports System.IO

<WebService(Namespace:="http://dtsue/")> _
<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Public Class LaunchSSISPackageService
  Inherits System.Web.Services.WebService

  ' 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

  <WebMethod()> _
  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 System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using Microsoft.SqlServer.Dts.Runtime;
using System.IO;

[WebService(Namespace = "http://dtsue/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class LaunchSSISPackageServiceCS : System.Web.Services.WebService
{
  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

  [WebMethod]
  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();

  }

}

Web サービスのテスト

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

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

  1. Visual Studio で任意のプログラミング言語を使用して、新しいコンソール アプリケーションを、Web サービス プロジェクトと同じソリューションに追加します。サンプル コードでは、プロジェクトに LaunchSSISPackageTest という名前を使用します。

  2. 新しいコンソール アプリケーションをソリューションのスタートアップ プロジェクトとして設定します。

  3. Web サービス プロジェクトの Web 参照を追加します。必要に応じて、Web サービス プロキシ オブジェクトに割り当てた名前に合わせて、サンプル コードの変数宣言を調整します。

  4. Main ルーチンとプライベート列挙のサンプル コードをコードに貼り付けます (このサンプルはコード ウィンドウの内容全体を表しています)。

  5. 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
      ' The type of exception returned by a Web service is:
      '  System.Web.Services.Protocols.SoapException
      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)
      {
        // The type of exception returned by a Web service is:
        //  System.Web.Services.Protocols.SoapException
        Console.WriteLine("The following exception occurred: " + ex.Message);
      }

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

    }

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

  }
}

トップに戻る

参照

処理手順

プログラムによるローカル パッケージの読み込みと実行
ローカル パッケージの出力の読み込み

概念

ローカル実行とリモート実行の相違点について

ヘルプおよび情報

SQL Server 2005 の参考資料の入手