Sdílet prostřednictvím


Programové načítání a spouštění vzdáleného balíčku

platí pro:SQL Server SSIS Integration Runtime ve službě Azure Data Factory

Pokud chcete spustit vzdálené balíčky z místního počítače, který nemá nainstalované integrační služby, spusťte balíčky tak, aby běžely na vzdáleném počítači, na kterém je nainstalovaná služba Integration Services. K dosažení tohoto cíle použijte k spuštění balíčků na vzdáleném počítači agenta SYSTÉMU SQL Server, webovou službu nebo vzdálenou komponentu. Pokud se pokusíte spustit vzdálené balíčky přímo z místního počítače, balíčky se načtou a pokusí se spustit z místního počítače. Pokud místní počítač nemá nainstalované integrační služby, balíčky se nespustí.

Poznámka:

Balíčky mimo SQL Server Data Tools nelze spouštět na klientském počítači, pokud není nainstalována služba Integration Services. Podmínky licencování SQL Serveru nemusí umožnit instalaci integračních služeb na jiné počítače. Integrační služby jsou serverovou komponentou a nedají se distribuovat do klientských počítačů.

Případně můžete spustit vzdálený balíček z místního počítače s nainstalovanou službou Integration Services. Další informace naleznete v tématu Načítání a spouštění místního balíčku programově.

Spuštění vzdáleného balíčku na vzdáleném počítači

Vzdálený balíček můžete spustit na vzdáleném serveru několika způsoby:

Téměř všechny metody použité v tomto tématu k načtení a uložení balíčků vyžadují odkaz na sestavení Microsoft.SqlServer.ManagedDTS . Výjimkou je ADO.NET přístup, který je ukázaný v tomto tématu při provádění sp_start_job uložené procedury, která vyžaduje pouze odkazy na System.Data a Microsoft.Data.SqlClient. Po přidání odkazu na sestavení Microsoft.SqlServer.ManagedDTS v novém projektu importujte Microsoft.SqlServer.Dts.Runtime obor názvů pomocí příkazu using nebo Imports .

Použití agenta SQL Serveru ke spuštění vzdáleného balíčku programově na serveru

Následující ukázka kódu ukazuje, jak programově používat agenta SQL Serveru ke spuštění vzdáleného balíčku na serveru. Ukázka kódu volá uloženou proceduru systému sp_start_job, která spustí úlohu agenta SQL Serveru. Úloha, kterou procedura spustí, má název RunSSISPackagea tato úloha je ve vzdáleném počítači. Úloha RunSSISPackage pak spustí balíček na vzdáleném počítači.

Poznámka:

Vrácená hodnota sp_start_job uložená procedura označuje, zda uložená procedura mohla úspěšně spustit úlohu agenta SQL Serveru. Vrácená hodnota nezoznačuje, jestli byl balíček úspěšný nebo neúspěšný.

Informace o řešení potíží s balíčky spouštěné z úloh agenta SQL Serveru najdete v článku Microsoftu, balíček SSIS se nespustí při volání balíčku SSIS z kroku úlohy agenta SQL Serveru.

Ukázka kódu

Imports System.Data  
Imports Microsoft.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, RunSSISPackage, started successfully.")  
      Case Else  
        Console.WriteLine("SQL Server Agent job, RunSSISPackage, failed to start.")  
    End Select  
    Console.Read()  
  
  End Sub  
  
End Module  
using System;  
using System.Data;  
using Microsoft.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, RunSSISPackage, started successfully.");  
          break;  
        default:  
          Console.WriteLine("SQL Server Agent job, RunSSISPackage, failed to start.");  
          break;  
      }  
      Console.Read();  
    }  
  }  
}  

Použití webové služby nebo vzdálené komponenty ke spuštění vzdáleného balíčku prostřednictvím kódu programu

Předchozí řešení pro spouštění balíčků na serveru programově nevyžaduje žádný vlastní kód na serveru. Možná ale dáváte přednost řešení, které při spouštění balíčků nespoléhá na agenta SQL Serveru. Následující příklad ukazuje, jak vytvořit webovou službu na serveru pro místní spuštění balíčků integračních služeb a testovací aplikaci pro volání webové služby z klientského počítače. Pokud dáváte přednost vytvoření vzdálené komponenty místo webové služby, můžete použít stejnou logiku kódu s několika změnami ve vzdálené komponentě. Vzdálená komponenta však může vyžadovat rozsáhlejší konfiguraci než webová služba.

Důležité

Ve výchozím nastavení pro ověřování a autorizaci nemá webová služba obecně dostatečná oprávnění pro přístup k SQL Serveru nebo systému souborů pro načtení a spouštění balíčků. Možná budete muset webové službě přiřadit příslušná oprávnění tak, že v souboruweb.config nakonfigurujete jeho nastavení ověřování a autorizace a podle potřeby přiřadíte oprávnění k databázi a systému souborů. Úplná diskuze o oprávněních k webu, databázi a systému souborů je nad rámec tohoto tématu.

Důležité

Metody Application třídy pro práci s úložištěm balíčků SSIS podporují pouze ".", localhost nebo název serveru pro místní server. Nemůžete použít "(local)".

Ukázka kódu

Následující ukázky kódu ukazují, jak vytvořit a otestovat webovou službu.

Vytvoření webové služby

Balíček integrační služby můžete načíst přímo ze souboru, z SQL Serveru nebo z úložiště balíčků SSIS. Úložiště balíčků SSIS spravuje úložiště balíčků jak v SQL Serveru, tak ve speciálních složkách systému souborů. Tato ukázka podporuje všechny dostupné možnosti pomocí konstruktoru Select Case nebo switch k výběru odpovídající syntaxe pro spuštění balíčku a zřetězení vstupních argumentů odpovídajícím způsobem. Metoda webové služby LaunchPackage vrátí výsledek spuštění balíčku jako celé číslo místo DTSExecResult hodnoty, aby klientské počítače nevyžadují odkaz na žádná sestavení integračních služeb.

Vytvoření webové služby pro spouštění balíčků na serveru prostřednictvím kódu programu
  1. Otevřete Visual Studio a vytvořte projekt webové služby v preferovaném programovacím jazyce. Ukázkový kód používá pro projekt název LaunchSSISPackageService.

  2. Přidejte odkaz na Microsoft.SqlServer.ManagedDTS a do souboru kódu pro obor názvů Microsoft.SqlServer.Dts.Runtime přidejte příkaz Imports nebo using.

  3. Vložte vzorový kód metody webové služby LaunchPackage do třídy. (Ukázka zobrazuje celý obsah okna kódu.)

  4. Sestavte a otestujte webovou službu poskytnutím sady platných hodnot pro vstupní argumenty metody LaunchPackage, která odkazují na existující balíček. Pokud je například package1.dtsx uložen na serveru v umístění C:\My Packages, předejte "soubor" jako hodnotu sourceType, C:\My Packages jako hodnotu sourceLocation a "package1" (bez přípony) jako hodnotu packageName.

Imports System.Web  
Imports System.Web.Services  
Imports System.Web.Services.Protocols  
Imports Microsoft.SqlServer.Dts.Runtime  
Imports System.IO  
  
<WebService(Namespace:="https://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 = "https://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();  
  
  }  
  
}  

Testování webové služby

Následující ukázková konzolová aplikace používá webovou službu ke spuštění balíčku. Metoda LaunchPackage webové služby vrátí výsledek spuštění balíčku jako celé číslo, DTSExecResult aby klientské počítače nevyžadují odkaz na žádná sestavení integračních služeb. Ukázka vytvoří privátní výčet, jehož hodnoty zrcadlí DTSExecResult hodnoty pro hlášení výsledků provádění.

Vytvoření konzolové aplikace pro otestování webové služby
  1. V sadě Visual Studio přidejte novou konzolovou aplikaci pomocí preferovaného programovacího jazyka do stejného řešení, které obsahuje projekt webové služby. Vzorový kód používá pro projekt název LaunchSSISPackageTest.

  2. Nastavte novou konzolovou aplikaci jako spouštěný projekt v řešení.

  3. Přidejte odkaz na web pro projekt webové služby. V případě potřeby upravte deklaraci proměnné v vzorovém kódu pro název, který přiřadíte k objektu proxy webové služby.

  4. Vložte vzorový kód pro rutinu Main a privátní výčet do kódu. (Ukázka zobrazuje celý obsah okna kódu.)

  5. Upravte řádek kódu, který volá Metodu LaunchPackage, aby poskytoval sadu platných hodnot pro vstupní argumenty, které odkazují na existující balíček. Pokud je například package1.dtsx uložen na serveru v C:\My Packages, předejte "soubor" jako hodnotu sourceType" C:\My Packages" jako hodnotu sourceLocationa "package1" (bez přípony) jako hodnotu 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  
    };  
  
  }  
}  

Externí zdroje

pochopení rozdílů mezi místním a vzdáleným spouštěním
načítání a spouštění místního balíčku prostřednictvím kódu programu
Načtení výstupu místního balíčku