Поделиться через


Программная загрузка и запуск удаленного пакета

Область применения: среда выполнения интеграции SSIS SQL Server в Фабрика данных Azure

Чтобы запустить удаленные пакеты с локального компьютера, на котором не установлены службы Integration Services, запустите пакеты, чтобы они запускались на удаленном компьютере, на котором установлены службы Integration Services. Для этого на локальном компьютере используется агент SQL Server, веб-служба или удаленный компонент для запуска пакетов на удаленном компьютере. Если попытаться запустить удаленные пакеты непосредственно с локального компьютера, пакеты будут загружены на локальный компьютер и будут запущены оттуда. Если на локальном компьютере нет установленных служб Integration Services, пакеты не будут выполняться.

Примечание.

Вы не можете запускать пакеты за пределами SQL Server Data Tools на клиентском компьютере, на котором не установлены службы Integration Services, и условия лицензирования SQL Server могут не позволить устанавливать службы Integration Services на дополнительных компьютерах. Службы Integration Services — это серверный компонент, который не распространяется на клиентские компьютеры.

Кроме того, можно запустить удаленный пакет с локального компьютера, на котором установлены службы Integration Services. Дополнительные сведения см. в разделе Программная загрузка и запуск локального пакета.

Запуск удаленного пакета на удаленном компьютере

Как упоминалось выше, существует несколько способов выполнения удаленного пакета на удаленном сервере.

Практически все методы, которые используются в этом разделе для загрузки и сохранения пакетов, требуют наличия ссылки на сборку Microsoft.SqlServer.ManagedDTS. Исключение составляет подход ADO.NET, продемонстрированный в этом разделе, к выполнению хранимой процедуры sp_start_job, для которой необходима только ссылка на сборку System.Data. После добавления ссылки на сборку Microsoft.SqlServer.ManagedDTS в новый проект импортируйте пространство имен Microsoft.SqlServer.Dts.Runtime с помощью инструкции using или Imports.

Использование агент SQL Server для программного запуска удаленного пакета на сервере

В следующем примере кода показано, как программно использовать агент SQL Server для запуска удаленного пакета на сервере. В примере кода вызывается системная хранимая процедура, sp_start_job, которая запускает задание агент SQL Server. Задание, запускаемое процедурой, называется RunSSISPackage и расположено на удаленном компьютере. Затем задание RunSSISPackage запускает пакет на удаленном компьютере.

Примечание.

Возвращаемое значение хранимой процедуры sp_start_job указывает, удалось ли хранимой процедуре успешно запустить задание агент SQL Server. Значение возврата не указывает на успешное или неуспешное выполнение пакета.

Сведения об устранении неполадок пакетов, выполняемых из заданий агент SQL Server, см. в статье Майкрософт, пакет служб SSIS не запускается при вызове пакета служб SSIS из шага задания агент SQL Server.

Пример кода

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

Использование веб-службы или удаленного компонента для программного запуска удаленного пакета

В предыдущем решении для запуска пакетов программным способом на сервере не требовалось размещать какой-либо пользовательский код на сервере. Однако, возможно, предпочтительным окажется решение, не зависящее от агента SQL Server для выполнения пакетов. В следующем примере показана веб-служба, которую можно создать на сервере для локального запуска пакетов служб Integration Services, а также тестовое приложение, которое можно использовать для вызова веб-службы с клиентского компьютера. Если предпочтительней создать удаленный компонент вместо веб-службы, можно использовать ту же логику кода после внесения незначительных изменений в удаленный компонент. Однако для удаленного компонента может потребоваться более сложная настройка, чем для веб-службы.

Внимание

Веб-служба (с настройками по умолчанию для проверки подлинности и авторизации) обычно не имеет достаточных разрешений для доступа к SQL Server или файловой системе, чтобы загрузить и выполнить пакеты. Возможно, потребуется назначить соответствующие разрешения для веб-службы путем настройки ее проверки подлинности и авторизации в файле web.config и назначения необходимых разрешений для доступа к базе данных и файловой системе. Подробное обсуждение разрешений на доступ к базе данных и файловой системе из Интернета выходит за область этого раздела.

Внимание

Методы класса Application для работы с хранилищем пакетов служб SSIS поддерживают только имена «.», localhost и имя сервера для локального сервера. Нельзя использовать имя «(local)».

Пример кода

В следующем образце кода демонстрируется, как создать и проверить веб-службу.

Создание веб-службы

Пакет служб Integration Services можно загрузить непосредственно из файла, непосредственно из SQL Server или из хранилища пакетов служб SSIS, который управляет хранилищем пакетов как в SQL Server, так и в специальных папках файловой системы. Этот образец поддерживает все доступные параметры с помощью конструкции Select Case или switch, чтобы выбрать подходящий синтаксис для запуска пакета и соответствующего объединения его входных аргументов. Метод веб-службы LaunchPackage возвращает результат выполнения пакета в виде целого числа вместо DTSExecResult значения, чтобы клиентские компьютеры не требовали ссылки на сборки служб Integration Services.

Создание веб-службы для запуска пакетов на сервере программным способом
  1. Откройте среду Visual Studio и создайте проект веб-службы на предпочитаемом языке программирования. В образце кода для проекта используется имя LaunchSSISPackageService.

  2. Добавьте ссылку на Microsoft.SqlServer.ManagedDTS и затем добавьте инструкцию Imports или using в файл кода для пространства имен Microsoft.SqlServer.Dts.Runtime.

  3. Вставьте образец кода из метода веб-службы LaunchPackage в класс. (В этом образце приводится полное содержимое окна кода.)

  4. Постройте и проверьте веб-службу, предоставив набор допустимых значений для входных аргументов метода LaunchPackage, указывающих на существующий пакет. Например, если пакет package1.dtsx хранится на сервере в папке C:\My Packages, передайте «file» в качестве значения sourceType, «C:\My Packages» в качестве значения sourceLocation и «package1» (без расширения файла) в качестве значения 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();  
  
  }  
  
}  

Проверка веб-службы

В следующем образце приложения командной строки для запуска пакета используется веб-служба. Метод LaunchPackage веб-службы возвращает результат выполнения пакета в виде целого числа вместо DTSExecResult значения, чтобы клиентские компьютеры не требовали ссылки на сборки служб Integration Services. В образце создается закрытое перечисление, значения которого отражают значения DTSExecResult, составляя отчет о результатах выполнения.

Создание приложения командной строки для проверки веб-службы
  1. В среде Visual Studio добавьте новое приложение командной строки на предпочитаемом языке программирования в то же решение, в котором содержится проект веб-службы. В образце кода для проекта используется имя LaunchSSISPackageTest.

  2. Определите новое приложение командной строки как автоматически загружаемый проект в решении.

  3. Добавьте веб-ссылку в проект веб-службы. При необходимости измените декларацию переменной в образце кода на имя, назначенное для объекта учетной записи-посредника веб-службы.

  4. Вставьте образец кода для подпрограммы Main и закрытого перечисления в код. (В этом образце приводится полное содержимое окна кода.)

  5. Измените строку кода, которой вызывается метод LaunchPackage, и укажите допустимые значения для входных аргументов, которые указывают на существующий пакет. Например, если пакет package1.dtsx хранится на сервере в папке C:\My Packages, передайте «file» в качестве значения параметра sourceType, «C:\My Packages» — в качестве значения параметра sourceLocation и «package1» (без расширения файла) — в качестве значения параметра 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  
    };  
  
  }  
}  

Внешние ресурсы

См. также

Основные сведения об отличиях между локальным и удаленным выполнением
Программная загрузка и запуск локального пакета
Загрузка выхода локального пакета