Como executar um pacote SSIS do .NET?

87

Eu tenho um pacote SSIS que eventualmente gostaria de passar parâmetros também, esses parâmetros virão de um aplicativo .NET (VB ou C #), então eu estava curioso para saber se alguém sabe como fazer isso, ou melhor ainda, um site com dicas úteis sobre como fazer isso.

Então, basicamente, eu quero executar um pacote SSIS do .NET passando os parâmetros do pacote SSIS que ele pode usar dentro dele.

Por exemplo, o pacote SSIS usará a importação de arquivo simples para um banco de dados SQL, no entanto, o caminho e o nome do arquivo podem ser o parâmetro que é passado do aplicativo .Net.

Hadi
fonte
10
Para futuros leitores: Antes de usar a solução abaixo, analise seu licenciamento. Acredito que isso só funcione em máquinas com SSIS instalado, não apenas a referência DLL. Em um ambiente de produção, normalmente até a instalação do SSIS sem instalar o mecanismo de banco de dados em si exige uma licença.
John Spiegel
Alguém pode confirmar o comentário de @JohnSpiegel? Isso funcionará apenas em um ambiente de produção se o SSIS estiver instalado?
Josh Noe
Para sua informação, o link para Executando o pacote SSIS programaticamente foi alterado para docs.microsoft.com/en-us/archive/blogs/michen/…
LoJo

Respostas:

59

Aqui está como definir variáveis ​​no pacote do código -

using Microsoft.SqlServer.Dts.Runtime;

private void Execute_Package()
    {           
        string pkgLocation = @"c:\test.dtsx";

        Package pkg;
        Application app;
        DTSExecResult pkgResults;
        Variables vars;

        app = new Application();
        pkg = app.LoadPackage(pkgLocation, null);

        vars = pkg.Variables;
        vars["A_Variable"].Value = "Some value";               

        pkgResults = pkg.Execute(null, vars, null, null, null);

        if (pkgResults == DTSExecResult.Success)
            Console.WriteLine("Package ran successfully");
        else
            Console.WriteLine("Package failed");
    }
Craig Schwarze
fonte
2
@IanCampbell Presumo que você esteja se referindo a Microsoft.SqlServer.Dts.Runtime? Dts é apenas o nome legado do SSIS - é apenas a declaração do namespace. O código acima é compatível daqui para frente.
Spikeh
3
@IanCampbell Sim, o DTS está depreciado (na verdade, não acho que você possa usar o DTS com as versões mais recentes do SQL Server - não que eu tenha tentado encontrá-lo!). No entanto, o namespace .Net que contém alguns dos componentes do SSIS ainda contém a palavra Dts. Garanto que é a versão atual e é válida.
Spikeh
4
Ok, obrigado @Spikeh! É importante ressaltar que, quando recentemente implementei um código semelhante para carregar um pacote SSIS com Dts, tive que obter manualmente o Microsoft.SqlServer.ManagedDTS.dllarquivo do "GAC", na C:\Windows\assemblypasta, para compilar esse código.
Ian Campbell
3
Sim, eu também - estava fazendo o mesmo ontem! Estou usando VS2012 e .Net 4 (para o pacote SSIS) / 4.5 (para meus testes de unidade). Tive que obter a montagem de C: \ Windows \ Microsoft.NET \ assembly \ GAC_MSIL \ Microsoft.SqlServer.ManagedDTS \ v4.0_11.0.0.0__89845dcd8080cc91, pois não existia em nenhuma das outras pastas de montagem, ou no Pastas SQL.
Spikeh
1
Alguns links para MSDN: 1) Pacote local (mesma máquina): msdn.microsoft.com/en-us/library/ms136090.aspx . 2) Pacote remoto (armazenado em uma máquina diferente daquela em que o programa está sendo executado), usando jobs de agente SQL: msdn.microsoft.com/en-us/library/ms403355.aspx
Faiz
22

Veja como fazer isso com o catálogo SSDB que foi introduzido com o SQL Server 2012 ...

using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Data.SqlClient;

using Microsoft.SqlServer.Management.IntegrationServices;

public List<string> ExecutePackage(string folder, string project, string package)
{
    // Connection to the database server where the packages are located
    SqlConnection ssisConnection = new SqlConnection(@"Data Source=.\SQL2012;Initial Catalog=master;Integrated Security=SSPI;");

    // SSIS server object with connection
    IntegrationServices ssisServer = new IntegrationServices(ssisConnection);

    // The reference to the package which you want to execute
    PackageInfo ssisPackage = ssisServer.Catalogs["SSISDB"].Folders[folder].Projects[project].Packages[package];

    // Add a parameter collection for 'system' parameters (ObjectType = 50), package parameters (ObjectType = 30) and project parameters (ObjectType = 20)
    Collection<PackageInfo.ExecutionValueParameterSet> executionParameter = new Collection<PackageInfo.ExecutionValueParameterSet>();

    // Add execution parameter (value) to override the default asynchronized execution. If you leave this out the package is executed asynchronized
    executionParameter.Add(new PackageInfo.ExecutionValueParameterSet { ObjectType = 50, ParameterName = "SYNCHRONIZED", ParameterValue = 1 });

    // Add execution parameter (value) to override the default logging level (0=None, 1=Basic, 2=Performance, 3=Verbose)
    executionParameter.Add(new PackageInfo.ExecutionValueParameterSet { ObjectType = 50, ParameterName = "LOGGING_LEVEL", ParameterValue = 3 });

    // Add a project parameter (value) to fill a project parameter
    executionParameter.Add(new PackageInfo.ExecutionValueParameterSet { ObjectType = 20, ParameterName = "MyProjectParameter", ParameterValue = "some value" });

    // Add a project package (value) to fill a package parameter
    executionParameter.Add(new PackageInfo.ExecutionValueParameterSet { ObjectType = 30, ParameterName = "MyPackageParameter", ParameterValue = "some value" });

    // Get the identifier of the execution to get the log
    long executionIdentifier = ssisPackage.Execute(false, null, executionParameter);

    // Loop through the log and do something with it like adding to a list
    var messages = new List<string>();
    foreach (OperationMessage message in ssisServer.Catalogs["SSISDB"].Executions[executionIdentifier].Messages)
    {
        messages.Add(message.MessageType + ": " + message.Message);
    }

    return messages;
}

O código é uma pequena adaptação de http://social.technet.microsoft.com/wiki/contents/articles/21978.execute-ssis-2012-package-with-parameters-via-net.aspx?CommentPosted=true#commentmessage

Há também um artigo semelhante em http://domwritescode.com/2014/05/15/project-deployment-model-changes/

Paul Hatcher
fonte
Onde o microsoft.sqlserver.management.integrationservices.dll está localizado? Tenho o SQL2014 instalado e não consigo encontrá-lo fazendo uma pesquisa no Windows.
2
Aparentemente, é apenas no local de montagem
Posso usar o código acima com implantação de pacote? Não consegui encontrar nenhum método.
Manish Jain
7

Para adicionar a resposta @Craig Schwarze,

Aqui estão alguns links do MSDN relacionados:

Carregando e executando um pacote local programaticamente:

Carregando e executando um pacote remoto programaticamente

Capturando eventos de um pacote em execução:

using System;
using Microsoft.SqlServer.Dts.Runtime;

namespace RunFromClientAppWithEventsCS
{
  class MyEventListener : DefaultEvents
  {
    public override bool OnError(DtsObject source, int errorCode, string subComponent, 
      string description, string helpFile, int helpContext, string idofInterfaceWithError)
    {
      // Add application-specific diagnostics here.
      Console.WriteLine("Error in {0}/{1} : {2}", source, subComponent, description);
      return false;
    }
  }
  class Program
  {
    static void Main(string[] args)
    {
      string pkgLocation;
      Package pkg;
      Application app;
      DTSExecResult pkgResults;

      MyEventListener eventListener = new MyEventListener();

      pkgLocation =
        @"C:\Program Files\Microsoft SQL Server\100\Samples\Integration Services" +
        @"\Package Samples\CalculatedColumns Sample\CalculatedColumns\CalculatedColumns.dtsx";
      app = new Application();
      pkg = app.LoadPackage(pkgLocation, eventListener);
      pkgResults = pkg.Execute(null, null, eventListener, null, null);

      Console.WriteLine(pkgResults.ToString());
      Console.ReadKey();
    }
  }
}
Faiz
fonte
1

Portanto, há outra maneira de realmente dispará-lo de qualquer idioma. Acho que da melhor maneira, você pode apenas criar um arquivo em lote que chamará seu pacote .dtsx.

Em seguida, você chama o arquivo em lote de qualquer idioma. Como na plataforma Windows, você pode executar o arquivo em lote de qualquer lugar, acho que esta será a abordagem mais genérica para o seu propósito. Sem dependências de código.

Abaixo está um blog para mais detalhes.

https://www.mssqltips.com/sqlservertutorial/218/command-line-tool-to-execute-ssis-packages/

Boa codificação .. :)

Obrigado Ayan

Ayan Chakraborty
fonte
0

Você pode usar esta função se tiver alguma variável no SSIS.

    Package pkg;

    Microsoft.SqlServer.Dts.Runtime.Application app;
    DTSExecResult pkgResults;
    Variables vars;

    app = new Microsoft.SqlServer.Dts.Runtime.Application();
    pkg = app.LoadPackage(" Location of your SSIS package", null);

    vars = pkg.Variables;

    // your variables
    vars["somevariable1"].Value = "yourvariable1";
    vars["somevariable2"].Value = "yourvariable2";

    pkgResults = pkg.Execute(null, vars, null, null, null);

    if (pkgResults == DTSExecResult.Success)
    {
        Console.WriteLine("Package ran successfully");
    }
    else
    {

        Console.WriteLine("Package failed");
    }
Rafayel Ahmed
fonte