Error al cargar Excel desde DTS, dice que hay valores nulos cuando no los hay

by Marc Cortada 07/12/2012

Al ejecutar uno de los pasos de un paquete DTS de SQL Server 2000 me da el error:

Texto del error: "El número de filas con errores sobrepasa el máximo especificado. Error de conversión 'DTSTransformation…' de TransformCopy: el destino no admite valores NULL en el par de columnas 1 (columna de origen 'ID_...' (DBTYPE_R8), columna de destino 'ID_...' (DBTYPE_I4))."

El paso de la DTS que da el error consiste en una carga de datos de una hoja Excel a una tabla de SQL Server. Nos dice que hay una fila que contiene un valor nulo en un campo cuya tabla de destino no admite valores nulos.

Sin embargo al repasar la hoja de cálculo veo que todos los valores de ese campo (o columna) están informados. Por lo tanto, aparentemente este error no tiene razón de ser. ¿Qué puede estar pasando? Pues pueden pasar dos cosas:

  1. Hay filas al final del rango de datos que no están completamente eliminadas (este es el más fácil de resolver, aunque a veces cuesta de ver).
  2. Hay datos cuyo tipo no es consistente por cualquiera de las siguientes posibilidades:
    1. La columna de destino de SQL Server es del tipo número y en el Excel el número está guardado como texto.
    2. Al revés, SQL Server espera un texto y tenemos un número en Excel.
    3. Sea como sea la columna de destino, en Excel tenemos algunos datos como texto y otros como número (este es el caso del ejemplo).

¡Solamente que nos pase una de estas cosas ya es posible que tengamos este error!

Para solucionar el primer caso (1):

Hay filas al final del rango de datos que no están completamente eliminadas, de manera que están sin contenido o sin valor, pero están. En Excel hay que distinguir dos tipos de eliminaciones: la eliminación del contenido o el valor de la/s celda/s por una parte, y por otra parte la eliminación de la fila completa, de manera que no tendremos celdas vacías, si no que las filas no estarán ahí aunque también veamos la cuadrícula atenuada. Es normal seguirlas viendo para insertar algún valor si es necesario, pero la última fila de la tabla debe ser la última que existe. Para que la carga funcione correctamente, nos tenemos que asegurar que las filas que no forman parte del rango que queremos cargar están completamente eliminadas. Por lo tanto:

  • Nos desplazaremos al final del rango (CTRL + Flecha Abajo).
  • Seleccionamos la siguiente fila del rango o la primera que tiene que estar completamente vacía, haciendo clic en el número de la fila (el 13453 del ejemplo)


  • Ampliamos la selección a todas las filas hasta el final de la hoja (CTRL + MAYUSCULAS + flecha abajo)

  • Y hacemos clic con el botón derecho sobre cualquier número de fila.
  • Clic en opción eliminar

Con esto nos aseguramos que no haya filas en blanco o vacías después del rango de datos. De esta forma no tendremos filas con valores nulos.

Pero no hemos terminado, nos queda solucionar el segundo caso (2).

Puede que haya un conflicto de tipo de datos (un clásico). Si una columna tiene los valores numéricos y en algunos casos están almacenados como texto, puede que la carga no funcione correctamente especialmente si la tabla de destino de SQL tiene la columna definida como numérica. En tal caso, lo que tendremos que hacer es mirar la columna de destino en el paso de la DTS. Si el destino es un número, es recomendable convertir todos los valores de la columna de Excel a números. En el caso que me ocupa me doy cuenta de que hay valores almacenados como texto por la advertencia (triángulo verde de la parte superior izquierda que hay en las celdas) como se puede ver en la imagen.

La solución es simple: convertir todas las filas de esa columna a números. ¿Y cómo se convierten todos los valores de una fila a números? Pues lo explico a continuación con un vídeo y en una lista paso a paso. Los pasos a seguir son los mismos en caso de querer hacer lo contrario (pasar los valores de número a texto) solo cambiaremos la función que utilizamos para obtener el tipo que nos interesa.

  1. Insertar una columna al lado de la columna que se quiere convertir.
  2. Crear una fórmula que retorne un texto o un valor a partir del valor de la columna original pero sin alterarlo.
    1. En el caso de convertir a número podemos usar la fórmula valor(<referencia>).
    2. En el caso de convertir a texto podemos utilizar la fórmula concatenar (<referencia>). Al concatenar una sola celda no cambiaremos el valor de la fila, pero nos devolverá los datos en formato texto.
  3. Copiar esta fórmula para todas las filas de la tabla (basta con hacer doble clic en el cuadrado de la esquina inferior derecha).
  4. Si no tocamos nada, la columna nos quedará seleccionada con todos los valores generados por la fórmula. Ahora es el momento de copiar (CTRL + C).
  5. Seleccionamos todos los valores a pegar de la columna original.
    1. Nos sitiamos en la primera celda.
    2. Para ir al último del rango seleccionando (si el rango es completo, que debería serlo) lo haremos con la combinación: CTRL + MAYUS + flecha abajo
  6. Y ahora viene el truco: pegar valores (NO hacer un pegar normal, NO sirve el CTRL + V !!!)
    1. Nos vamos a la flecha de debajo del botón pegar y marcamos la opción de "pegar valores".
  7. Finalmente eliminamos la columna temporal que hemos creado en el primer paso. Como hemos pegado valores y no son referencias a las celdas de la columna temporal, los valores se mantendrán en la columna que acabamos de pegar. Y como los valores devueltos por la fórmula eran de tipo texto o número, dependiendo de la fórmula utilizada en la columna temporal, pues el valor que nos queda en la columna original es del tipo que queremos.

Ahora ya podemos guardar el Excel y sabemos que está limpio de filas en blanco o vacías que pueden suponer valores nulos en la carga de datos (caso a), y que la columna que nos daba error tiene todos los valores del tipo adecuado (caso b). Después de guardarlo, ejecutamos el proceso de carga y en mi caso, ¡ya funciona!

Si con estos dos casos no os funciona, puede que haya más columnas con datos guardados en diversos formatos, otros casos de inconsistencia de datos, o simplemente que haya cambiado el nombre de la columna o el nombre de la hoja Excel, etc. En estos casos, aunque la descripción del error sea un valor null no válido, las causas reales pueden ser diversas y habrá que buscar más allá de lo que aquí se describe.

Este caso ha sido el caso b, sin embargo he seguido los pasos de la opción (a) para asegurarme de que no había filas sin contenido. ¡Es recomendable considerar siempre la primera opción aunque sea para descartar!

Tags:

Categorías: BBDD | SQLServer | Excel | Solución a errores

No se aceptan más comentarios

Entradas por mes