Programmgesteuertes Laden und Ausführen eines RemotepaketsLoading and Running a Remote Package Programmatically

Um Remotepakete auf einem lokalen Computer auszuführen, auf dem Integration ServicesIntegration Services nicht installiert ist, starten Sie die Pakete, sodass sie auf dem Remotecomputer ausgeführt werden, auf dem Integration ServicesIntegration Services installiert ist.To run remote packages from a local computer that does not have Integration ServicesIntegration Services installed, start the packages so that they run on the remote computer on which Integration ServicesIntegration Services is installed. Hierzu muss auf dem lokalen Computer SQL ServerSQL Server-Agent, ein Webdienst oder eine Remotekomponente zum Starten der Pakete auf dem Remotecomputer verwendet werden.You do this by having the local computer use SQL ServerSQL Server Agent, a Web service, or a remote component to start the packages on the remote computer. Wenn Sie versuchen, die Remotepakete direkt auf dem lokalen Computer zu starten, werden die Pakete geladen, und es wird versucht, die Pakete auf dem lokalen Computer auszuführen.If you try to start the remote packages directly from the local computer, the packages will load onto and try to run from the local computer. Wenn Integration ServicesIntegration Services nicht auf dem lokalen Computer installiert ist, werden die Pakete nicht ausgeführt.If the local computer does not have Integration ServicesIntegration Services installed, the packages will not run.

Hinweis

Sie können Pakete außerhalb von SQL Server Data ToolsSQL Server Data Tools nur auf Clientcomputern ausführen, auf denen Integration ServicesIntegration Services installiert ist, wobei die Bedingungen Ihrer SQL ServerSQL Server-Lizenz möglicherweise die Installation von Integration ServicesIntegration Services auf weiteren Computern nicht zulässt.You cannot run packages outside SQL Server Data ToolsSQL Server Data Tools on a client computer that does not have Integration ServicesIntegration Services installed, and the terms of your SQL ServerSQL Server licensing might not let you install Integration ServicesIntegration Services on additional computers. Bei Integration ServicesIntegration Services handelt es sich um eine Serverkomponente, die nicht an Clientcomputer weitergegeben werden darf. Integration ServicesIntegration Services is a server component and is not redistributable to client computers.

Alternativ können Sie ein Remotepaket auch auf einem lokalen Computer ausführen, auf dem Integration ServicesIntegration Services installiert ist.Alternately, you can run a remote package from a local computer that has Integration ServicesIntegration Services installed. Weitere Informationen finden Sie unter laden und Ausführen einer lokalen Paket programmgesteuert.For more information, see Loading and Running a Local Package Programmatically.

Ausführen eines Remotepakets auf dem Remotecomputer Running a Remote Package on the Remote Computer

Wie bereits erwähnt, gibt es mehrere Möglichkeiten, ein Remotepaket auf einem Remoteserver auszuführen:As mentioned above, there are multiple ways in which you can run a remote package on a remote server:

Mithilfe von SQL Server-Agent ein Remotepaket programmgesteuert auf dem Server ausgeführt. Using SQL Server Agent to Run a Remote Package Programmatically on the Server

Im folgenden Beispielcode wird die programmgesteuerte Verwendung von SQL ServerSQL Server-Agent zum Ausführen eines Remotepakets auf dem Server veranschaulicht.The following code sample demonstrates how to programmatically use SQL ServerSQL Server Agent to run a remote package on the server. Im Codebeispiel wird die gespeicherte Systemprozedur, Sp_start_job, welche startet eine SQL ServerSQL Server -Agent-Auftrag.The code sample calls the system stored procedure, sp_start_job, which launches a SQL ServerSQL Server Agent job. Der Auftrag, den die Prozedur startet, hat den Namen RunSSISPackage und befindet sich auf dem Remotecomputer.The job that the procedure launches is named RunSSISPackage, and this job is on the remote computer. Der RunSSISPackage-Auftrag führt das Paket auf dem Remotecomputer aus.The RunSSISPackage job then runs the package on the remote computer.

Hinweis

Der Rückgabewert von der Sp_start_job gespeicherte Prozedur gibt an, ob die gespeicherte Prozedur gestartet wurde die SQL ServerSQL Server Agent-Auftrag.The return value of the sp_start_job stored procedure indicates whether the stored procedure was able to start the SQL ServerSQL Server Agent job successfully. Der Rückgabewert gibt nicht an, ob beim Ausführen des Pakets ein Fehler aufgetreten ist.The return value does not indicate whether the package succeeded or failed.

Informationen zur Fehlerbehebung bei Paketen, die aus ausgeführt werden SQL ServerSQL Server -Agent-Aufträge, finden Sie im Microsoft-Artikel ein SSIS-Paket wird nicht ausgeführt, wenn Sie das SSIS-Paket von einem SQL Server-Agent-Auftrag Aufrufen.For information on troubleshooting packages that are run from SQL ServerSQL Server Agent jobs, see the Microsoft article, An SSIS package does not run when you call the SSIS package from a SQL Server Agent job step.

BeispielcodeSample Code

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

Verwenden von einem Webdienst oder einer Remotekomponente zum programmgesteuert ein Remotepaket ausführen Using a Web Service or Remote Component to Run a Remote Package Programmatically

Für die vorherige Lösung zum programmgesteuerten Ausführen von Paketen auf dem Server ist kein benutzerdefinierter Code auf dem Server erforderlich.The previous solution for running packages programmatically on the server does not require any custom code on the server. Möglicherweise bevorzugen Sie jedoch eine Lösung, bei der Pakete ohne SQL Server-Agent ausgeführt werden.However, you may prefer a solution that does not rely on SQL Server Agent to execute packages. Im Folgenden wird ein Beispiel für einen Webdienst, der auf dem Server zum lokalen Starten von Integration ServicesIntegration Services-Paketen erstellt werden kann, sowie für eine Testanwendung dargestellt, mit deren Hilfe der Webdienst von einem Clientcomputer aus aufgerufen werden kann.The following example demonstrates a Web service that can be created on the server to start Integration ServicesIntegration Services packages locally, and a test application that can be used to call the Web service from a client computer. Wenn Sie eine Remotekomponente anstelle eines Webdiensts erstellen lieber, können Sie dieselbe Codelogik mit nur wenigen Änderungen in einer remote-Komponente.If you prefer to create a remote component instead of a Web service, you can use the same code logic with very few changes in a remote component. Für eine Remotekomponente sind jedoch möglicherweise umfangreichere Konfigurationsschritte erforderlich als für einen Webdienst.However a remote component may require more extensive configuration than a Web service.

Wichtig

Mit den Standardeinstellungen für die Authentifizierung und Autorisierung verfügt ein Webdienst im Allgemeinen nicht über die erforderlichen Berechtigungen für den Zugriff auf SQL Server oder das Dateisystem, um Pakete zu laden und auszuführen.With its default settings for authentication and authorization, a Web service generally does not have sufficient permissions to access SQL Server or the file system to load and execute packages. Möglicherweise müssen Sie den Webdienst geeigneten Berechtigungen zuzuweisen, indem Sie konfigurieren die Einstellungen für die Authentifizierung und Autorisierung in der "Web.config" Datei- und Zuweisen von Datenbank und Dateisystemberechtigungen entsprechend.You may have to assign appropriate permissions to the Web service by configuring its authentication and authorization settings in the web.config file and assigning database and file system permissions as appropriate. Eine ausführliche Beschreibung von Berechtigungen für Webdienste, Datenbanken und Dateisysteme ist nicht Gegenstand dieses Themas.A complete discussion of Web, database, and file system permissions is beyond the scope of this topic.

Wichtig

Die Methoden der Application -Klasse zum Arbeiten mit dem SSIS-Paketspeicher unterstützen nur ".", "localhost" oder den Namen für den lokalen Server.The methods of the Application class for working with the SSIS Package Store support only ".", localhost, or the server name for the local server. Sie können "(local)" nicht verwenden.You cannot use "(local)".

BeispielcodeSample Code

In den folgenden Codebeispielen wird gezeigt, wie der Webdienst erstellt und getestet wird.The following code samples show how to create and test the Web service.

Erstellen des WebdienstsCreating the Web Service

Ein Integration ServicesIntegration Services-Paket kann direkt aus einer Datei, direkt aus SQL Server oder aus dem SSIS-Paketspeicher geladen werden, der die Paketspeicherung sowohl in SQL Server-Ordnern als auch in speziellen Dateisystemordnern verwaltet.An Integration ServicesIntegration Services package can be loaded directly from a file, directly from SQL Server, or from the SSIS Package Store, which manages package storage in both SQL Server and special file system folders. Dieses Beispiel unterstützt alle verfügbaren Optionen mithilfe einer Select Case oder wechseln Konstrukt, um die geeignete Syntax zum Starten des Pakets auszuwählen und die Eingabeargumente verketten entsprechend.This sample supports all the available options by using a Select Case or switch construct to select the appropriate syntax for starting the package and to concatenate the input arguments appropriately. Die LaunchPackage-Webdienstmethode gibt das Ergebnis der Paketausführung als ganze Zahl zurück und nicht als DTSExecResult-Wert, sodass Clientcomputers keinen Verweis auf Integration ServicesIntegration Services-Assemblys benötigen.The LaunchPackage Web service method returns the result of package execution as an integer instead of a DTSExecResult value so that client computers do not require a reference to any Integration ServicesIntegration Services assemblies.

So erstellen Sie einen Webdienst zum programmgesteuerten Ausführen von Paketen auf dem ServerTo create a Web service to run packages on the server programmatically
  1. Öffnen Sie Visual Studio, und erstellen Sie in der gewünchsten Programmiersprache ein Webdienstprojekt.Open Visual Studio and create a Web service project in your preferred programming language. Im Beispielcode wird der Name "LaunchSSISPackageService" für das Projekt verwendet.The sample code uses the name LaunchSSISPackageService for the project.

  2. Hinzufügen eines Verweises auf Microsoft.SqlServer.ManagedDTS und Hinzufügen einer Importe oder mit Anweisung, um die Codedatei für die ** Microsoft.SqlServer.Dts.Runtime** Namespace.Add a reference to Microsoft.SqlServer.ManagedDTS and add an Imports or using statement to the code file for the Microsoft.SqlServer.Dts.Runtime namespace.

  3. Fügen Sie den Beispielcode für die LaunchPackage-Webdienstmethode in die Klasse ein.Paste the sample code for the LaunchPackage Web service method into the class. (Im Beispiel ist der gesamte Inhalt des Codefensters dargestellt.)(The sample shows the whole contents of the code window.)

  4. Erstellen und testen Sie den Webdienst. Stellen Sie hierzu eine Reihe gültiger Werte für die Eingabeargumente der LaunchPackage-Methode bereit, die auf ein vorhandenes Paket zeigen.Build and test the Web service by providing a set of valid values for the input arguments of the LaunchPackage method that point to an existing package. Beispiel: Wenn package1.dtsx auf dem Server im Verzeichnis C:\My Packages gespeichert ist, übergeben Sie "file" als Wert von sourceType, "C:\My Packages" als Wert von sourceLocation und "package1" (ohne Erweiterung) als Wert von packageName.For example, if package1.dtsx is stored on the server in C:\My Packages, pass "file" as the value of the sourceType, "C:\My Packages" as the value of sourceLocation, and "package1" (without the extension) as the value of packageName.

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

  }  

}  

Testen des WebdienstsTesting the Web Service

Im folgenden Beispiel für eine Konsolenanwendung wird der Webdienst zum Ausführen eines Pakets verwendet.The following sample console application uses the Web service to run a package. Die LaunchPackage-Methode des Webdiensts gibt das Ergebnis der Paketausführung als ganze Zahl zurück und nicht als DTSExecResult-Wert, sodass Clientcomputers keinen Verweis auf Integration ServicesIntegration Services-Assemblys benötigen.The LaunchPackage method of the Web service returns the result of package execution as an integer instead of a DTSExecResult value so that client computers do not require a reference to any Integration ServicesIntegration Services assemblies. Mit dem Beispiel wird zum Melden der Ausführungsergebnisse eine private Enumeration erstellt, deren Werte die DTSExecResult-Werte spiegeln.The sample creates a private enumeration whose values mirror the DTSExecResult values to report the results of execution.

So erstellen Sie eine Konsolenanwendung zum Testen des WebdienstsTo create a console application to test the Web service
  1. Fügen Sie in Visual Studio mithilfe der gewünschten Programmiersprache eine neue Konsolenanwendung zu der Projektmappe hinzu, die das Webdienstprojekt enthält.In Visual Studio, add a new console application, using your preferred programming language, to the same solution that contains the Web service project. Im Beispielcode wird der Name LaunchSSISPackageTest für das Projekt verwendet.The sample code uses the name LaunchSSISPackageTest for the project.

  2. Legen Sie die neue Konsolenanwendung als Startprojekt in der Projektmappe fest.Set the new console application as the startup project in the solution.

  3. Fügen Sie einen Webverweis für das Webdienstprojekt hinzu.Add a Web reference for the Web service project. Passen Sie ggf. die Variablendeklaration im Beispielscode für den Namen an, den Sie dem Webdienstproxyobjekt zuweisen.If necessary, adjust the variable declaration in the sample code for the name that you assign to the Web service proxy object.

  4. Fügen Sie den Beispielcode für die Hauptroutine und die private Enumeration in den Code ein.Paste the sample code for the Main routine and the private enumeration into the code. (Im Beispiel ist der gesamte Inhalt des Codefensters dargestellt.)(The sample shows the whole contents of the code window.)

  5. Bearbeiten Sie die Codezeile, die die LaunchPackage-Methode aufruft, um eine Reihe gültiger Werte für die Eingabeargumente bereitzustellen, die auf ein vorhandenes Paket zeigen.Edit the line of code that calls the LaunchPackage method to provide a set of valid values for the input arguments that point to an existing package. Beispiel: Wenn package1.dtsx auf dem Server im Verzeichnis C:\My Packages gespeichert ist, übergeben Sie "file" als Wert von sourceType, "C:\My Packages" als Wert von sourceLocation und "package1" (ohne Erweiterung) als Wert von packageName.For example, if package1.dtsx is stored on the server in C:\My Packages, pass "file" as the value of sourceType, "C:\My Packages" as the value of sourceLocation, and "package1" (without the extension) as the value of packageName.

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

  }  
}  

Externe RessourcenExternal Resources

Siehe auchSee Also

Grundlegendes zu den Unterschieden zwischen lokalen und Remote-Ausführung Understanding the Differences between Local and Remote Execution
Programmgesteuerten laden und Ausführen eines lokalen Pakets Loading and Running a Local Package Programmatically
Laden der Ausgabe eines lokalen PaketsLoading the Output of a Local Package