El objetivo de este post es orientar a los nuevos desarrolladores que comienzan a diseñar paquetes SSIS sobre la resolución de algunos problemas básicos que se nos pueden presentar en el trabajo del día a día. Recientemente alguien planteó la siguiente duda: Mi paquete carga datos a una tabla y en algunas ocasiones genera un error debido a la diferencia de longitud de la columna del flujo con la columna de destino. ¿Cómo soluciono este problema?
El problema se genera al mapear columnas del flujo de datos a columnas con un tamaño menor, ya sea en el flujo de datos o en un destino (tabla, fichero, etc..)
Existen dos formas (o más) para solventar este problema:
· Ajustar el tamaño de la columna en el flujo
· Ajustar el tamaño de la columna en destino
Como determinar cuál es el tamaño correcto para una columna
El tamaño de la columna debe ser igual o superior al valor más alto que esperemos obtener como contenido, si es una cadena de texto el número de caracteres, si es un campo numérico el valor más alto.
Si podemos analizar el origen de datos, es conveniente utilizar el Data Profiling Task para generar un informe de estadísticas sobre el contenido de los campos, que nos facilita datos como el porcentaje de nulos contenido en la columna, el valor más alto, el menor, etc..
Es posible que el contenido de la columna se construya dinámicamente, concatenando varios campos por ejemplo. En estos casos debemos tener una idea de cuál es el tamaño máximo esperado y configurar la columna de destino con esa longitud.
Para revisar el tamaño de las columnas en el flujo haga doble clic sobre algún conector (pipeline) en el flujo de datos y acceda a la pestaña Metadatos
Ajustando el tamaño de columna en destino
Si necesitas guardar toda la información que se genera en el flujo de datos para la columna, está claro que no tienes otra opción que modificar la columna de destino. Si es un fichero de texto, habrá que modificar la longitud de la columna en el administrador de conexión. Si es una tabla, modifica el campo mediante una consulta, etc…
Ajustando el tamaño de la columna en el Flujo (DataFlow)
Si no puedes o no te interesa modificar la longitud de la columna de destino tendrás que hacerlo en el flujo de datos, para lo que tienes dos (o más) opciones:
· Utilizar un data conversión component
· Utilizar un derived column component
1. Data conversion component (Conversión de datos)
http://msdn.microsoft.com/en-us/library/ms141706.aspx
Este componente, provisto en todas las ediciones de SSIS, tiene como fin exclusivo la creación de nuevas columnas basadas en las existentes modificando el tipo de datos, intentando convertir al tipo destino el contenido de la columna. Esto puede generar un error si el valor contenido no es convertible al tipo de destino. Por ejemplo, intentar convertir la cadena ‘@’ a un tipo numérico (I4), generará un error.
Para ajustar la longitud de la columna sencillamente acceda al campo longitud y modifíquelo convenientemente.
Pero, ¿y que pasa si el contenido del campo origen excede el tamaño que le estamos asignando a la nueva columna? El componente generará un error por Truncamiento, por lo que es muy recomendable configurar la salida de errores para estos casos. Para estas filas que exceden el tamaño de la columna debemos redirigirlas a un componente columna derivada y se recortar su contenido para ajustarlo al tamaño.
El diseño del paquete tiene que mostrar algo similar a la siguiente imagen:
En la columna dervidada configuramos la creación de una nueva columna, que llamaremos igual que la columna generada en el Data Conversion:
Finalmente y como se muestra en la imagen anterior, hay que unir los resultados desde la conersion de datos al Union All y desde la columna derivada al unión all.
Solo queda mapear la nueva columna al destino.
2. Derived column component (Columna derivada)
Préstele atención a este componente, es muy flexible y potente. Es capaz de modificar contenido de columnas o crear otras utilizando expresiones, valores de columnas, valores de variables, posee funciones de conversión de tipos de datos.
Puede resolver el problema sin utilizar el Data Conversion component. Puede realizar conversiones de tipos y modificaciones en el contenido en un solo paso.
Para ello utilice una expresión similar a la siguiente:
FixedColumn <= (DT_STR,200,1252) Substring(Column0,1,200)