tutorial loop for destination create contenedor container bucles beginners file ssis flat

file - loop - Archivos planos SSIS con números de columna variables



ssis for beginners (3)

SSIS hace dos cosas en relación con el manejo de archivos planos que son particularmente frustrantes, y parece que debería haber una forma de evitarlos, pero no puedo resolverlo. Si define un archivo plano con 10 columnas, la pestaña delimitada con CRLF como marcador de final de fila funcionará perfectamente para archivos en los que hay exactamente 10 columnas en cada fila. Los 2 escenarios dolorosos son estos:

  1. Si alguien proporciona un archivo con una columna número 11 en cualquier lugar, sería bueno que SSIS simplemente lo ignore, ya que no lo ha definido. Simplemente debe leer las 10 columnas que ha definido y luego saltar al marcador de final de fila, pero lo que hace es concatenar cualquier dato adicional con los datos en la 10ma columna y tachar todo eso en la 10ma columna. Un poco inútil en realidad. Me doy cuenta de que esto sucede porque el delimitador de la décima columna no es tabular como todos los demás, sino CRLF, por lo que simplemente capta todo hasta el CRLF, reemplazando pestañas extra con nada mientras lo hace. Esto no es inteligente, en mi opinión.

  2. Si alguien proporciona un archivo con solo 9 columnas, sucede algo aún peor. Ignorará temporalmente el CRLF que ha encontrado inesperadamente y rellenará las columnas que faltan con columnas desde el inicio de la siguiente fila. No inteligente es una subestimación aquí. ¿Quién querría que eso pasara? El resto del archivo es basura en ese punto.

No parece irracional tener variaciones en el ancho del archivo por la razón que sea (por supuesto, solo se pueden manejar las variaciones al final de una fila (x menos o columnas adicionales) pero parece que esto simplemente no se maneja bien, a menos que yo Me estoy perdiendo algo

Hasta ahora, nuestra única solución a esto es cargar una fila como una columna gigante (columna0) y luego usar una tarea de secuencia de comandos para dividirla de forma dinámica utilizando los delimitadores que encuentre. Esto funciona bien, excepto que limita el ancho de fila a 4000 caracteres (el ancho máximo de una columna Unicode). Si necesita importar una fila más amplia (por ejemplo, con más de 4000 columnas anchas para la importación de texto), entonces debe definir varias columnas como se indicó anteriormente, pero entonces se verá obligado a exigir un número estricto de columnas por fila.

¿Hay alguna forma de evitar estas limitaciones?


Glenn, siento tu dolor :) SSIS no puede hacer que las columnas sean dinámicas, ya que necesita almacenar los metadatos de cada columna a medida que avanza, y dado que estamos trabajando con archivos planos que pueden contener cualquier tipo de datos, no puede supongamos que el CRLF en una ''columna-que-no-es-la-última-columna'', es de hecho el final de la línea de datos que se supone que debe leer.

A diferencia de DTS en SQL2000, no puede cambiar las propiedades de un paquete SSIS en tiempo de ejecución.

Lo que podría hacer es crear un paquete primario, que lea el archivo plano (tarea de script) y solo lea la primera línea del archivo plano para obtener el número de columnas y los nombres de las columnas. Esta información se puede almacenar en una variable.

A continuación, el paquete principal carga el paquete secundario (tarea de script de nuevo) programáticamente y actualiza los metadatos de la conexión de origen del paquete hijo. Aquí es donde puede: 1. Agregar / eliminar columnas para que coincida con el archivo plano. 2. Establezca el delimitador de columna para las columnas, la última columna tiene que ser el CRLF - que coincida con el delimitador de ROW 3. Reinicie los metadatos (ComponentMetadata.ReinitializeMetadata ()) del Source Compoenent en la tarea Dataflow (para reconocer los cambios recientes en la conexión de origen). 4. Guarde el paquete hijo ssis.

Los detalles sobre la modificación programática de un paquete están disponibles únicamente.

Luego, su paquete primario simplemente ejecuta el paquete Child (Ejecutar tarea de paquete), y se ejecutará con sus nuevas asignaciones.


Me encuentro con los mismos problemas y quería apuntarlo a un proyecto CodePlex que encontré que está abordando estos problemas: http://ssisdfs.codeplex.com/