¿Cómo se puede en un Flujo de Datos (Data Flow) de SSIS insertar sólo las filas nuevas? Esta es una situación muy típica al realizar procesos de carga con SSIS que se ejecutan periódicamente. Por ejemplo, si estamos cargando la facturación de una empresa, queremos que sólo se inserten los nuevos clientes, pues al intentar insertar un cliente existente se produciría un error de violación de clave. Principalmente, tenemos de formas de afrontar este problema con SSIS.
Utilizando la tarea Merge Join. Join. Esta tarea permite realizar un Join entre dos Flujos de datos de SSIS. A diferencia de la tarea Merge, M erge, Merge Join permite realizar no sólo un INNER JOIN, sino también un LEFT OUTER JOIN o un FULL OUTER JOIN. La tarea Merge Join, y al igual que la tarea Merge, sólo tiene dos entradas (es entradas (es posible utilizar varias tareas Merge o Merge Join en cascada). Es requisito que sus entradas estén ordenadas, para lo cual, se suele utiliza tareas Sort. Sort. En el caso que nos ocupa, deberemos utilizar un LEFT OUTER JOIN. JOIN. Seguidamente, utilizaremos una tarea Conditional Split, Split, que nos permita definir una salida con sólo los nuevos clientes, siendo esta salida la que conectaremos con nuestro destino de datos. La condición que utilizaremos en la nueva salida será algo como "ISNULL(ClienteID)" "ISNULL(ClienteID)".. Finalmente, el Flujo de Datos (Data Flow), quedará como se muestra en la siguiente imagen.
Utilizando la tarea Lookup. Esta tarea permite hacer una búsqueda (Lookup) sobre otra tabla u origen de datos, permitiendo devolver un valor asociado. Un ejemplo de caso de uso típico es el siguiente: si estamos cargando en SQL Server un fichero de empleados en el que viene el código de la categoría profesional del empleado, pero que no incluye el nombre o descripción de dicha categoría, se podría utilizar la tarea Lookup para hacer una búsqueda sobre la tabla de Categorías, y obtener de la misma la descripción de la categoría para cada empleado. En el ejemplo de las Facturas, al cargar la tabla de Clientes, podemos utilizar una tarea Lookup para obtener de la tabla Clientes de nuestro Data Warehouse, el código del mismo. De este modo, si obtenemos como código NULL, será porque el cliente es nuevo !!. Aquí existe un problema: la tarea Lookup por defecto, sólo funciona si para cada fila encuentra otra fila en la tabla de búsqueda. En caso contrario se produce el error "Row yielded no match during lookup". Por lo tanto, no podríamos utilizar la tarea Lookup para nuestros fines. Sin embargo, es posible alterar la configuración de la salida de error de la tarea Lookup. Para ello, editar la tarea Lookup (click con el botón derecho sobre la tarea Lookup, y después click Edit). En el diálogo Lookup Transformation Editor, click sobre el botón Configure Error Output. A continuación, en el diálogo Configure Error Output, modificar su configuración como se muestra en la siguiente imagen de ejemplo.
Realizado esto, es necesario utilizar una tarea Conditional Split, que nos permita definir una salida con sólo los nuevos clientes, siendo esta salida la que conectaremos con nuestro destino de datos. La condición que utilizaremos en la nueva salida será algo como"ISNULL(ClienteID)".
Como conclusión, podemos comentar lo siguiente:
Utilizando la tarea Merge Join. Es la manera natural de resolver el problema que nos ocupa. Aunque el desarrollo del Data Flow se hace más complejo, se da un uso apropiado a las tareas utilizadas. Utilizando la tarea Lookup. Resulta más fácil y rápido el desarrollo del Data Flow. Sin embargo, implica realizar un uso no apropiado de la tarea configuración de la salida de error.