De programacion y otros demonios

lunes, 15 de noviembre de 2010

SSIS - Como usar foreach Loop

Inicio una serie de posts sobre cómo usar cada uno de los elementos del toolbox; aprovecho para ayudar a Maria sobre el uso del foreach Loop.  Los ejemplos los realizo sobre la base de datos de ejemplo AdventureWorks.  El ejemplo es leer los resultados de una tabla y por cada uno, ejecutar otra consulta sql.

1.  Creo una variable a nivel de paquete llamada V_resultados de tipo Object, aquí guardaré todo el resultset de mi consulta sql.  Crea otra variable llamada V_idEmployee de tipo Int32, esta es una variable temporal que usaremos para guardar cada uno de los id de la consulta a medida que lo vamos recorriendo en el ciclo.

2.  Agrega y configura un componente "Execute SQL Task" con la sentencia select; y en la sección de ResultSet agrega la variable V_resultados.  De esta forma todos mis registros quedan allí guardados.




3. Agrega y configura un componente "Foreach Loop Container"; en la sección Collection escoge como enumerator el "Foreach ADO enumerator" y como ADO Object source variable, nuestra variable V_resultados.  En la sección Variable Mappings, elige V_idEmployee como index 0. De esta forma a cada iteración del ciclo se guardará cada uno de los id de empleado en esa variable.





4.  Por último agrega un componente "Execute SQL Task", con la sentencia sql que necesitas, por lo general es un update, para mi ejemplo hice otro select (jajaja) en fin; mi consulta recibe como parametro el id del empleado, asi que en la sección Parameter mapping agrego mi variable asignada al nombre de parametro 0.






El componente foreach loop es realmente muy útil, y puedo usarlo sobre las siguientes colecciones:
  • Foreach ADO enumerator.  Usado para recorrer registros de tablas, como lo usamos en este ejemplo.
  • Foreach ADO.NET Schema Rowset enumerator. Usado para listar la información del esquema de un data source. Por ejemplo, obtener una lista de las tablas en la BD de adventureWorks
  • Foreach File enumerator. Para leer los archivos en un folder.  Supongamos que un proceso deja las ventas diarias en una carpeta en archivos CSV, pero en esa carpeta tambien me guardan archivos de word, excel, etc.  Podríamos usar este componente para leer solo los archivos con extensión CSV, y que empiecen por VENTADIA y así trabajar con sus datos.
  • Foreach From Variable enumerator.  Para enumerar los elementos dentro de una variable, por ejemplo leer cada uno de los valores de un arreglo.
  • Foreach Item enumerator.
  • Foreach Nodelist enumerator.
  • Foreach SMO enumerator.
Estos tres últimos no los he tenido que usar.  He tomado algunos fragmentos del sitio de microsoft en inglés: http://msdn.microsoft.com/en-us/library/ms141724.aspx donde pueden leer más al respecto.

Etiquetas:

11 comentarios:

  • Estimado amigo tu proyecto no funciona, seguí paso a paso y me da el siguiente error:

    Error: Variable "User::V_Resultados" does not contain a valid data object

    De Blogger Unknown, A las 22 de noviembre de 2010, 10:25  

  • Muy buena guía.

    Maria

    De Anonymous Anónimo, A las 30 de noviembre de 2010, 0:47  

  • Hola Mauricio...

    Eso puede ocurrir porque el tipo de la variable no es Object, o porque el resultado de la consulta que llena la variable está vacío.. dime un poco más para ayudarte.

    De Blogger sobenavi, A las 8 de diciembre de 2010, 15:12  

  • Existe alguna forma para ver el estado o el valor de las variables

    De Blogger Wilmar SG, A las 6 de noviembre de 2012, 8:44  

  • Hola Wilmar SG

    porque no intentas colocar un Script Task dentro del ciclo donde te saque un mensaje con los valores de las variables?... es obvio, pero lo dire, acuerdate que te saldra una ventanita por cada iteracion de tu conjunto de datos.

    De Blogger sobenavi, A las 7 de noviembre de 2012, 10:58  

  • Hola. gracias por tus comentarios, ya avance bastate y realice el ejercicio muy similar a tu ejemplo, pero al revisar las variables, el parametro v_idEmployee no almacena/guarda los valores del objeto......(te informo que no soy un experto en este tema y autodidacticamente estoy aprendiendo) espero me puedas seguir orientando. gracias.

    De Blogger Wilmar SG, A las 7 de noviembre de 2012, 15:16  

  • gracias. Y aprovechando. como seria la solucion con el script task. la verdad no se mucho del tema y menos del lenguaje. una ejemplo me ayudaria. y ademas, como haria para realizar una conversion de tipo de datos de int32 a string y viceversa. saludos.

    De Blogger Wilmar SG, A las 7 de noviembre de 2012, 15:37  

  • hola. me puedes indicar como hacer ese paso. y como puedo convertir una variable, por ejemplo v_empleado a cadena o de entero a cadena. gracias.

    De Blogger Wilmar SG, A las 13 de noviembre de 2012, 6:12  

  • Lo intentare !!

    De Anonymous Anónimo, A las 29 de septiembre de 2014, 8:29  

  • Hola gente de BI. Mi nombre es Hugo y les escribo para ver si me pueden dar una mano con una tarea específica de SSIS. Más específicamente Foreach Loop Container. En mi versión anterior de SSIS 2008 la tenía programada para que ejecutara distintos paquetes usando un "paquete comodín" al que por variable le iba a cambiando el nombre y los iba ejecutando.
    Ahora en la versión 2012 que estoy usando, si bien puedo hacer lo mismo. No estoy pudiendo ver cada paquete que se ejecuta, en ventanas nuevas. O sea con 2008 iba abriendo cada paquete que iba ejecutando. En 2012 no lo puedo terminar de configurar. Ya no sé si es un problema de configuración de la tarea "package", de la tarea "for each loop container" o ya directamente es un tema de configuración general del Visual Studio 2012.
    Bueno si a alguien del blog le pasó algo similar, le agradezco si me puede dar una mano.
    Un saludo, y felicitaciones por el blog.
    Hugo

    De Anonymous Anónimo, A las 22 de abril de 2016, 6:15  

  • Buenos días,
    Hace un tiempo que busco como guardar los nombres de los campos en variables para pasarlo a una tabla en SQL, todo esto a través de SSIS (sql server 2005). ¿Sería posible realizar algo así utilizando "Foreach ADO.NET Schema Rowset enumerator"? Soy bastante nueva en esto de SSIS, y algunas cosillas aun se me complican...
    Gracias de antemano!

    De Anonymous Anónimo, A las 3 de abril de 2017, 3:28  

Publicar un comentario



<< Inicio