jueves, 18 de abril de 2013

SSIS Básico: Guardar valor de columnas en una variable

 

En relación a uno de los comentarios que me han dejado en el post SSIS Básico: Ajustando la longitud de una columna, volvemos a la carga con pequeño how-to de como guardar el valor de una columna en una variable dentro de un Data Flow a utilizando un Script component.

Para poneros en situación, voy a utilizar una tabla que guarda tweets publicados con ciertas palabras, y guardaremos en la variable el último usuario que haya publicado en función de la fecha  del tweet registrada en la columna Created_at.

Primero debemos contar con la variable en la que necesitamos guardar el valor, para este ejemplo he creado la variable VariableCadena, con ámbito de paquete para poder utilizarla en el Control Flow o subsiguientes Data Flows:

image

Dentro del Data Flow en el que vamos a registrar el valor de alguna columna en la variable, añadimos un Script component en modo transformación:

image

En la configuración del componente, en la sección Input columns, seleccionamos la columna desde la que queremos obtener el valor, y cualquier otra que necesitemos si la lógica de asignación del valor tiene más dependencias. Para este ejemplo vamos a utilizar las columnas UserName y Created_at del flujo de datos:

image

Nos movemos a la sección Script y añadimos nuestra variable a la lista de variables con acceso de escritura.

image

Pulsamos el botón Edit Script para escribir el código necesario (ejemplo en C#). Algo que debemos tener en cuenta es que no se permite la escritura de valores en variables fuera del método PostExecute(), por lo que nos tendremos que apoyarnos en variables de la clase ScriptMain para poder dar salida a nuestra variable de paquete.

Otro detalle a comentar es el método <nombreInput>_ProcessInputRow, que se ejecutará para cada una de las filas que provea el flujo de datos conectado a este componente.

Con esto en mente, escribimos el siguiente código:

[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{
//variables de apoyo para la lógica
string UserName = string.Empty;
DateTime Created_at = DateTime.MinValue;

public override void Input0_ProcessInputRow(Input0Buffer Row)
{
//evaluamos si la fila actual tiene una fecha mayor a la registrada por la última fila
if (Row.Createdat > this.Created_at)
{
//asignamos el nombre del usuario a la variable interna
this.UserName = Row.UserName;
this.Created_at = Row.Createdat;
}
}

public override void PostExecute()
{
base.PostExecute();
//asignamos el valor de la variable interna a la variable de paquete
this.Variables.VariableCadena = this.UserName;
}
}

Como habeis comprobado, utilizamos la variable interna UserName para guardar el valor que queremos asignar a la variable de paquete en el método PostExecute().


Otra nota importante: Dentro del mismo Data Flow no se puede acceder al contenido de la variable modificada. Cuando el proceso de ejecución entra en el Data Flow se bloquea el valor que tuviera la variable en el momento del evento PreExecute(), como se muestra en el post SSIS Utilizando el RowCount. Recordad que a la variable de paquete le asignamos el valor en el evento PostExecute().


Sin embargo, el nuevo valor esta diponible a partir de entonces y por tanto para cualquier tarea que se ejecute a continuación. Podemos mostrar el valor de la variable en un Script task desde el Control Flow con propósitos didacticos, aunque este tipo de mecanismos se suele utilizar para luego pasar como parámetro a filtros en consultas en otro Data Flow o Execute SQL…


image


 





2 comentarios:

  1. Gracias brother no era exactamente lo que necesitaba pero me diste la idea para resolver mi duda.

    ResponderEliminar
  2. Victor tengo una pregunta, de que manera puedo seleccionar ciertos valores dentro de un mismo campo, es decir; tengo un campo que viene con la siguiente información:
    55;#Robledo, Gabriel G.;#122;#Alvarez, Sergio Diego;#148;#Calderon, Gonzalo J.
    Lo que necesito es poder separar por columnas cada nombre con su respectivo código.... así
    55 Robledo, Gabriel G
    122 Alvarez, Sergio Diego
    148 Calderon, Gonzalo J.
    Agradezco tu respuesta . saludos

    ResponderEliminar

Entradas populares