¿No os ha pasado alguna vez que os piden automatizar absolutamente todo? En la mayoría de los casos cuanto menos intervenga la mano de una persona para una tarea secuencial que siempre es la misma mejor. Otra cosa que suele pasar mucho, es cuando un usuario de negocio tiene que pedir a la gente de IT de su empresa que ejecute cierto proceso que ellos no pueden ejecutar, ya sea por permisos o por conocimiento de cómo realizar el proceso.

En este post vamos a explicar cómo automatizar el compilado de un proyecto de SQL Server Integration Services (SSIS de ahora en adelante), el despliegue del proyecto al servidor de SSIS y la ejecución de paquetes de SSIS mediante una aplicación en C#.

Creación del Proyecto

El primer paso será crear nuestro proyecto en Visual Studio (VS) para ello, abrimos el Visual Studio y creamos un nuevo proyecto de Consola de C#:

File -> New -> Project…

Visual studio start page

En la sección de Visual C#, seleccionamos Console App:

Automatización de procesos de paquetes SQL Server en SSIS usando C#

Compilación del proyecto de SSIS

El siguiente paso sería realizar el compliado del proyecto, para ello nos vamos a apoyar en un archivo .bat al que le pasaremos como argumento el path en el que se encuentra nuestro proyecto de SSIS. Para ello vamos a añadir un nuevo elemento a nuestro proyecto:

Click derecho sobre el proyecto -> Add -> New Item…

Automatización de procesos de paquetes SQL Server en SSIS usando C#

Le damos un nombre a nuestro fichero, en nuestro caso se llamará “comando.bat” y pulsamos sobre Add:

Automatización de procesos de paquetes SQL Server en SSIS usando C#

Y escribimos el siguiente código dentro del fichero comando.bat que acabamos de crear:

@echo off
set par1=%1
cd “C:\”
cd “Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE
devenv.com %par1% /rebuild “Development”
 

Tenemos que poner la ruta en la que se encuentra el fichero devenv.com en nuestro entorno, en mi caso al estar usando el Visual Studio Community 2017, la ruta es la que se especifica en el código anterior.

Ahora vamos a crear la función que llamará al .bat pasándole el path del proyecto para hacer el compilado del proyecto.

Para ello, vamos al fichero Program.cs de nuestra solución de VS y añadimos la siguiente instrucción en la sección de los using del fichero, justo arriba del todo:

using System.Diagnostics;
 

Y añadimos la siguiente función que se llamará BuildSSISProject justo debajo del Main:

static void BuildSSISProject(string path)
{
string pathProject = @“”“” + path + @“”“”;
Process process = new Process();
process.StartInfo.Arguments = pathProject;
process.StartInfo.FileName = @“C:\Users\Oliver\Documents\VS Projects\Automatizacion_SSIS\Automatizacion_SSIS\comando.bat”;
process.Start();
}
 

En la propiedad FileName tenemos que poner la ruta en la que se encuentra el fichero comando.bat que hemos creado anteriormente.

Ahora vamos a ejecutar esta función para ver su funcionamiento y para generar el fichero .ispac que nos hará falta para el siguiente paso de despliegue del proyecto. Para ello vamos a poner en la función Main una llamada a la función de BuildSSISProject pasándole como parámetro la ruta en la que se encuentra el proyecto de SSIS que queremos compilar.

El código del Program.cs quedaría de la siguiente manera:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;
 
namespace Automatizacion_SSIS
{
class Program
{
static void Main(string[] args)
{
string projectPath = @“C:\Users\Oliver\Documents\VS Projects\SSISTest\SSISTest.sln”;
BuildSSISProject(projectPath);
}
 
static void BuildSSISProject(string path)
{
string pathProject = @“”“” + path + @“”“”;
Process process = new Process();
process.StartInfo.Arguments = pathProject;
process.StartInfo.FileName = @“C:\Users\Oliver\Documents\VS Projects\Automatizacion_SSIS\Automatizacion_SSIS\comando.bat”;
process.Start();
}
}
}
 

En nuestro ejemplo vamos a hacer el compilado de un proyecto de SSIS que se llama SSISTest y se encuentra en la ruta que se especifica en la variable projectPath.

Ejecutamos la solución pulsando sobre el botón Start y el resultado será que en nuestra carpeta de Development del proyecto SSIS que acabamos de compilar, tiene que aparecer el fichero .ispac, como se muestra en la siguiente imagen:

ssis test

Despliegue del proyecto de SSIS

El siguiente paso será realizar el despliegue del proyecto en el servidor, para ello vamos a crear una nueva función a la que le pasaremos como parámetros:

  • El nombre del servidor.
  • El nombre de la carpeta dentro del catálogo de SSIS en la que queremos realizar el despliegue.
  • El nombre del proyecto.
  • La ruta en la que se encuentra el fichero .ispac que se creó en el paso anterior.

Primero tenemos que añadir 5 referencias nuevas a nuestro proyecto que son las marcadas en azul en la siguiente imagen:

referencias ssis

Para ellos hacemos botón derecho en References -> Add Reference…, buscamos su ubicación en nuestro entorno y le damos a Add:

Automatización de procesos de paquetes SQL Server en SSIS usando C#

El siguiente paso será añadir estas instrucciones using al inicio de fichero Program.cs.

using System.Data.SqlClient;
using Microsoft.SqlServer.Management.IntegrationServices;
using System.IO;
 

Y por último crear la función que se llamará DeploySSISProject que realizará el despliegue del proyecto:

static void DeploySSISProject(string targetServerName, string targetFolderName, string projectName, string projectFilePath)
{
// Create a connection to the server
string sqlConnectionString = “Data Source=” + targetServerName +
“;Initial Catalog=master;Integrated Security=SSPI;”;
SqlConnection sqlConnection = new SqlConnection(sqlConnectionString);
 
// Create the Integration Services object
IntegrationServices integrationServices = new IntegrationServices(sqlConnection);
 
// Get the Integration Services catalog
Catalog catalog = integrationServices.Catalogs[“SSISDB”];
 
// Create the target folder
CatalogFolder folder = catalog.Folders[targetFolderName];
 
byte[] projectFile = File.ReadAllBytes(projectFilePath);
folder.DeployProject(projectName, projectFile);
}
 

Ahora vamos a comprobar su funcionamiento haciendo una llamada a esta función desde el Main:

static void Main(string[] args)
{
string projectPath = @“C:\Users\Oliver\Documents\VS Projects\SSISTest\SSISTest.sln”;
string targetServerName = “W10”;
string targetFolderName = “SSISTest”;
string projectName = “SSISTest”;
string projectFilePath = @“C:\Users\Oliver\Documents\VS Projects\SSISTest\SSISTest\bin\Development\SSISTest.ispac”;
BuildSSISProject(projectPath);
DeploySSISProject(targetServerName, targetFolderName, projectName, projectFilePath);
}
 

Le damos a Start y el resultado será que en nuestro servidor aparecerá desplegado el proyecto en la carpeta de SSISTest, de nuestro catálogo de SSIS que se encuentra en nuestro servidor, que se llama W10:

Automatización de procesos de paquetes SQL Server en SSIS usando C#

Ejecución del paquete SSIS

Como último paso vamos a ver como ejecutar un paquete de un proyecto desplegado en nuestro catálogo de SSIS.

Para ello vamos a crear una nueva función que se llamará ExecuteSSISPackage en el fichero Program.cs, que recibirá como parámetros:

  • El nombre del servidor.
  • El nombre de la carpeta dentro del catálogo de SSIS.
  • El nombre del proyecto de SSIS.
  • El nombre del paquete de SSIS.
static void ExecuteSSISPackage(string targetServerName, string folderName, string projectName, string packageName)
{
// Create a connection to the server
string sqlConnectionString = “Data Source=” + targetServerName +
“;Initial Catalog=master;Integrated Security=SSPI;”;
SqlConnection sqlConnection = new SqlConnection(sqlConnectionString);
 
// Create the Integration Services object
IntegrationServices integrationServices = new IntegrationServices(sqlConnection);
 
// Get the Integration Services catalog
Catalog catalog = integrationServices.Catalogs[“SSISDB”];
 
// Get the folder
CatalogFolder folder = catalog.Folders[folderName];
 
// Get the project
ProjectInfo project = folder.Projects[projectName];
 
// Get the package
PackageInfo package = project.Packages[packageName];
 
// Run the package
package.Execute(false, null);
}

Ahora vamos a añadir la llamada a esta función al Main y vamos a ejecutar todo el proceso.

El Main quedaría de la siguiente manera:

static void Main(string[] args)
{
string projectPath = @“C:\Users\Oliver\Documents\VS Projects\SSISTest\SSISTest.sln”;
string targetServerName = “W10”;
string targetFolderName = “SSISTest”;
string projectName = “SSISTest”;
string packageName = “Package.dtsx”;
string projectFilePath = @“C:\Users\Oliver\Documents\VS Projects\SSISTest\SSISTest\bin\Development\SSISTest.ispac”;
BuildSSISProject(projectPath);
DeploySSISProject(targetServerName, targetFolderName, projectName, projectFilePath);
ExecuteSSISPackage(targetServerName, targetFolderName, projectName, packageName);
}
 

Para comprobar el funcionamiento del flujo completo, pulsamos sobre Start y una vez haya terminado, para comprobar el resultado, nos vamos a ir al SQL Server Management Studio (SSMS) y sobre el proyecto de SSIS, botón derecho -> Reports -> Standard Reports -> All Executions:

Automatización de procesos de paquetes SQL Server en SSIS usando C#

Y desde el informe que nos aparece, podemos ver el resultado/estado de la ejecución del paquete que acabamos de lanzar.

Automatización de procesos de paquetes SQL Server en SSIS usando C#

Como podéis observar en la imagen anterior el paquete llamado Package.dtsx del proyecto SSISTest, se ha ejecutado correctamente.

Os dejo el código completo del archivo Program.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;
using System.Data.SqlClient;
using Microsoft.SqlServer.Management.IntegrationServices;
using System.IO;
 
namespace Automatizacion_SSIS
{
class Program
{
static void Main(string[] args)
{
string projectPath = @“C:\Users\Oliver\Documents\VS Projects\SSISTest\SSISTest.sln”;
string targetServerName = “W10”;
string targetFolderName = “SSISTest”;
string projectName = “SSISTest”;
string packageName = “Package.dtsx”;
string projectFilePath = @“C:\Users\Oliver\Documents\VS Projects\SSISTest\SSISTest\bin\Development\SSISTest.ispac”;
BuildSSISProject(projectPath);
DeploySSISProject(targetServerName, targetFolderName, projectName, projectFilePath);
ExecuteSSISPackage(targetServerName, targetFolderName, projectName, packageName);
}
 
static void BuildSSISProject(string path)
{
string pathProject = @“”“” + path + @“”“”;
Process process = new Process();
process.StartInfo.Arguments = pathProject;
process.StartInfo.FileName = @“C:\Users\Oliver\Documents\VS Projects\Automatizacion_SSIS\Automatizacion_SSIS\comando.bat”;
process.Start();
}
 
static void DeploySSISProject(string targetServerName, string targetFolderName, string projectName, string projectFilePath)
{
// Create a connection to the server
string sqlConnectionString = “Data Source=” + targetServerName +
“;Initial Catalog=master;Integrated Security=SSPI;”;
SqlConnection sqlConnection = new SqlConnection(sqlConnectionString);
 
// Create the Integration Services object
IntegrationServices integrationServices = new IntegrationServices(sqlConnection);
 
// Get the Integration Services catalog
Catalog catalog = integrationServices.Catalogs[“SSISDB”];
 
// Create the target folder
CatalogFolder folder = catalog.Folders[targetFolderName];
 
byte[] projectFile = File.ReadAllBytes(projectFilePath);
folder.DeployProject(projectName, projectFile);
}
 
static void ExecuteSSISPackage(string targetServerName, string folderName, string projectName, string packageName)
{
// Create a connection to the server
string sqlConnectionString = “Data Source=” + targetServerName +
“;Initial Catalog=master;Integrated Security=SSPI;”;
SqlConnection sqlConnection = new SqlConnection(sqlConnectionString);
 
// Create the Integration Services object
IntegrationServices integrationServices = new IntegrationServices(sqlConnection);
 
// Get the Integration Services catalog
Catalog catalog = integrationServices.Catalogs[“SSISDB”];
 
// Get the folder
CatalogFolder folder = catalog.Folders[folderName];
 
// Get the project
ProjectInfo project = folder.Projects[projectName];
 
// Get the package
PackageInfo package = project.Packages[packageName];
 
// Run the package
package.Execute(false, null);
}
}
}
 

Conclusión

En este post hemos visto como realizar las operaciones de compilado, despliegue y ejecución del proceso de vida de un desarrollo en SSIS, todo ello automatizado usando un programa escrito en C#.

Un ejemplo de uso de esto sería por ejemplo tener una web o un frontal con algún botón para usuarios que quisieran ejecutar paquetes de SSIS a demanda, sin la necesidad de que los usuarios tengan conocimientos sobre lo que hay por debajo.

Espero que os haya gustado la idea y que os sirva de ayuda

¡Has llegado al final! Parece que te ha gustado nuestro post sobre SSIS

¿Necesitas sacar más partido a tus datos para impulsar tu proyecto? Acelera tus procesos de Business Analytics. Toma mejores decisiones, optimiza tu Datawarehouse y el proceso de generación de informes en tus proyectos de analítica con nuestra consultoría en Business Intelligence.

Voy a Echar un vistazo
0 Shares:
Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

You May Also Like