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.
Respostas:
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"); }
fonte
Microsoft.SqlServer.ManagedDTS.dll
arquivo do "GAC", naC:\Windows\assembly
pasta, para compilar esse código.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/
fonte
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(); } } }
fonte
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
fonte
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"); }
fonte