SSIS: Solución a dos errores sin motivo aparente cuando insertamos datos en MySql

SSIS: Solución a dos errores sin motivo aparente cuando insertamos datos en MySql il_masacratore 8 September, 2010 - 11:59

 

Por la razón que sea puede que tengamos que desarrollar un paquete de Microsoft Integration Services que nos mueva datos de cualquier origen a una tabla que se encuentra en una base de datos MySQL.

La primera intención será hacerlo mediante una ADO.NET Destination y el provider de MySQL para la conexión. Si lo hacemos así para insertar los datos directamente, al crear el destino, seleccionar la conexión y luego seleccionamos la tabla aparecerá un error como el siguiente al comprobarlo todo con la vista previa o al intentar hacer las asignaciones.

 

 

Este error se debe a al modo de compatibilidad sql ansi de la base de datos mysql donde intentamos cargar los datos. Para solventarlo debemos conectarnos al servidor de MySQL y cambiar la compatibilidad ansi de sql de la base de datos*:

 

TOCA:~# mysql -u root -p

Enter password:

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection id is 77

Server version: 5.0.51a-24+lenny3-log (Debian)

 

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

 

mysql> select @@global.sql_mode;

+-------------------+

| @@global.sql_mode |

+-------------------+

| |

+-------------------+

1 row in set (0.00 sec)

 

mysql> set global sql_mode='ANSI';

Query OK, 0 rows affected (0.00 sec)

 

mysql> select @@global.sql_mode;

+-------------------------------------------------------------+

| @@global.sql_mode |

+-------------------------------------------------------------+

| REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ANSI |

+-------------------------------------------------------------+

1 row in set (0.00 sec)

 

mysql> exit

 

Si volvemos a probar ya podremos tener una vista previa de la tabla o editar las asignaciones entre columnas pero nos encontraremos otro error al ejecutar el paquete:

[ADO NET Destination [843]] Error: Excepción durante la inserción de datos. El mensaje devuelto por el proveedor es: Unknown column 'p1' in 'field list'”

El driver tiene un problema y no nos deja trabajar bien con parametros (que es como se construyen las inserciones de registros en el destino) así que tenemos que hacer otro workaround para solventar este problema: trabajar con ADO.NET Destination en destino pero con un origen ODBC en la conexión. Esto unido al tema de la modificación del sql_mode del destino MySQL nos permitirá hacer la carga correctamente.

 

 

 

*Cabe destacar que la compatibilidad la podemos cambiar a nivel global como en el ejemplo o solo a nivel de session (con lo que deberíamos añadir la ejecución de un comando en primera instancia para modificar el valor de @@SESSION.sql_mode). Más info aquí.