¿Depurar un script SSIS?

Una de las mayores pegas que tiene Integration Services es el hecho de no poder depurar los scripts… bueno, ese y que el nodo script no soporte C# como lenguaje (sólo soporta Visual Basic). Si bien ninguno de los dos problemas tiene solución, el primero puede mitigarse en gran mediad con la capacidad que nos ofrece SSIS para lanzar trazas desde nuestros scripts. ¿Cómo se hace? ¡Atentos!


Los visores de datos: el script como una caja negra


Lo más sencillo para tratar de averiguar qué ocurre dentro de un script es observar qué salidas nos ofrece fuera. Para eso siempre podemos usar los “data viewers”, que se añaden directamente al flujo de salida o de entrada en un script y nos muestran el contenido de los buffers. Esto está bien para detectar problemas serios, pero la mayoría de las veces no será de gran ayuda. En la imagen, tenemos un script que genera números del 1 al 100 y una transformación que los cuenta… si vemos que la salida es anormal, siempre podemos entrar en el código del script e inspeccionarlo en busca del comportamiento anómalo. Por cierto… en este sentido, ayuda el que los scripts sean sencillos y hagan el mínimo posible de cosas.



Cuando el exterior no ayuda, lo importante está en el interior.


Cuando el problema no es obvio, llega el momento de depurar. Lo que nos dice el sentido común es que pongamos un breakpoint en nuestro procedimiento, y que lo vayamos observando paso a paso:



¿Qué ocurre cuando ejecutamos el paquete SSIS? Absolutamente nada: no se detiene. Los breakpoints no funcionan para los scripts de SSIS (¡¡Microsoft, Socorro!!). Mientras los programadores de Redmond acudan en nuestra ayuda y solucionen este problema, veamos qué podemos hacer para sobrevivir:


Un punto de ruptura cutre: El MessageBox



Afortunadamente, tenemos una chapucilla que nos permitirá parar la ejecución de un script SSIS: El MessageBox. Alguno dirá… tantos años de evolución para volver a sacar mensajitos de “estoy aqui” o “voy por acá”. Sí amigos… las viejas soluciones nunca mueren: “la chapu funciona” (máxima que aprendí en uno de las empresas en las que he trabajado hasta ahora). Colocar un “MessageBox.Show()” hará que el flujo del script se detenga hasta que pulsemos “OK”.


Observar el valor de una variable privada


Cualquiera podría decir, si puedo sacar un MessageBox, puedo mostrar el valor de una variable privada. Cierto… sólo que si queremos saber el valor de una varible privada a lo largo de todas las iteraciones de un bucle, detener la ejecución a cada paso puede ser un tormento. Por fortuna, SSIS nos permite utilizar su potente soporte de Logging desde nuestros scripts. Para eso, vamos al menú SSIS -> Logging, habilitamos un proveedor de logging, y en la pestaña de “Details” seleccionamos la entrada “ScriptComponentLogEntry”.



Eso habrá habilitado el logeo a los componentes script. En realidad ni siquiera es necesario especificar un destino para el log: bastará con mostrar la ventana “Log Events” (View -> Other Windows -> Log Events)…. pero ojo, que el visor de logs tiene sus limitaciones que veremos más adelante.


Ahora sólo tenemos que usar el método “Log” que nuestro script habrá heredado de su clase base, de la siguiente forma:



Me.Log( messageText, dataCode, dataBytes() )


El método Log admite tres parámetros:



  • La cadena de texto que queremos mostrar en el log
  • Un valor numérico que queramos loguear: Cuidado, esta opción sólo funciona si hemos activado un destino para el log, si estamos viendo los logs con el visor de logs, curiosamente no se ve su valor
  • Un buffer de datos que queramos loguear. Ocurre lo mismo que con la opción anterior, sólo sirve si definimos un destino para los logs (no funciona con el visor de logs).

Como el visor de logs no permite ver los valores asignados a dataCode y dataBytes, generalmente nos convendrá loguear todo dentro de la cadena de texto, de la siguiente forma:


Me.Log( “El valor de i es ” + i, 0, Nothing )


En fin, espero que esto os sirva para cogerle un poco más de cariño a la transformación Script, que no es tan mala como parece…

3 comentarios en “¿Depurar un script SSIS?”

  1. Hola, mira estoy intentando automatizar un proceso con SSIS, pero tengo un problema, no puedo agregar una referencia: Microsoft.AnalysisServices.Adomdclient, no lo ve SSIS. En la misma maquina, me creo una clase de consola e importo el namespace, pero desde SSIS no puedo. En la GAC yo lo he visto, pero desde SSIS no lo veo, sabes a que se debe?

    Gracias

  2. Hola Juan Antonio,

    Me había pasado desapercibido tu comentario hasta ahora. Te agradecería que adjuntases a los posts comentarios referentes a los posts. Para realizar este tipo de consultas tienes una opción de “Enviar mensaje”.

    De todas formas, respondiendo a tu mensaje… te diré que por desgracia SSIS no soporta Adomd. En lugar de usar Adomd tienes que utilizar el cliente OLEDB para OLAP 9.0 (odbo).

    Saludos,
    Gorka

Deja un comentario

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