martes, 6 de mayo de 2008

Invocar un paquete de SQL Server Integration Services 2005

Algo que suele presentarse muy frecuentemente es el tener que invocar un paquete de SQL Server Integration Services por programación, en este caso yo seleccioné Visual C#, mi caballito de batallas, aquí se detalla un método, ideal para cuando se guarda el paquete como sistema de archivos (*.dtsx). En el proximo post mostraré como hacerlo si se guarda el paquete en SQL Server.

En primer lugar es necesario habilitar la caracteristica xp_cmdshell, ya que con ella se va a ejecutar el paquete con la utilidad dtexec, (Antiguo dtsrun en SQL Server 2000) como si se estuviera en la linea de comandos. Esta actividad se hace por medio del SQL Server Surface Area Configuration.



El siguiente paso es ir a "Surface Area Configuration for Features" y habilitar el caracteristica mencionada (xp_cmdshell):



La continuación es crear un Stored Procedure que haga uso de xp_cmdshell:

CREATE PROCEDURE usp_CorrerPaqueteSSIS
@Comando VARCHAR(8000)
AS
DECLARE @returncode INT
EXEC @returncode = xp_cmdshell @Comando
RETURN @returncode


OK, hasta aqui se tiene toda la estructura de ejecución, pero la gran pregunta: "Y que valor se le manda al parametro @Comando?"...

La Respuesta: una cadena que cumpla con la siguiente sintaxis:

dtexec /f "[Ruta del Archivo]" /De [Clave de Cifrado]

dtexec /f "C:\Pruebas\Paquete1.dtsx" /De Pa$$w0rd

/f indica que el paquete fue guardado en Sistema de Archivos

/De es el atributo que indica el password con el cual fue cifrada la data critica del paquete (El Password del Connection String)

Finalmente el codigo C# con el cual se llama al Stored Procedure, aclaro que este codigo no esta basado en las mejores prácticas, esto simplemente ilustra como invocar a usp_CorrerPaqueteSSIS:

private int InvocarPaquete(string Ruta, string Password)
{
int resultado;
string parametro = "dtexec /f " + Ruta + " /De " + Password;
string connStr =
"Server=(local); Database=Pruebas; uid=usuario; pwd=password;";
SqlConnection conexion = new SqlConnection(connStr);
conexion.Open();
SqlCommand comando = new SqlCommand("usp_CorrerPaqueteSSIS", conexion);
comando.CommandType = CommandType.StoredProcedure;
comando.Parameters.Add(new SqlParameter("@Comando", parametro));
resultado = comando.ExecuteScalar();
return resultado;
}


Un pequeño detalle, el usuario que se utilice en el connection string debe estar en el esquema "sys" de la base de datos, de lo contrario todo esto resultará en un SqlException.

Ya para finalizar con este post, si el paquete recibe parámetros (Variables, ó Variables Globales como se llamaban en SQL Server 2000), a la sintaxis del comando hay que agregarle lo siguiente:

dtexec /f "[Ruta del Archivo]" /De [Clave de Cifrado] /SET \package\DataFlowTask.Variables[User::NombreVariable].Value;Valor

La diferencia esta en el atributo /SET.

Nos vemos en el proximo post.

Saludos,

Leonel J

No hay comentarios: