Fuente de datos SSIS de Excel: ¿es posible anular los tipos de datos de columna?

Cuando se utiliza una fuente de datos de Excel en SSIS, los tipos de datos de cada columna individual se derivan de los datos de las columnas. ¿Es posible anular este comportamiento?

Idealmente, nos gustaría que cada columna entregada desde la fuente de Excel sea un tipo de datos de cadena, de modo que la validación de datos se pueda realizar en los datos recibidos de la fuente en un paso posterior en el flujo de datos.

Actualmente, la pestaña Salida de error se puede usar para ignorar las fallas de conversión; los datos en cuestión son nulos y el paquete continuará ejecutándose. Sin embargo, queremos saber cuáles eran los datos originales para poder generar un mensaje de error apropiado para esa fila.

preguntado el 12 de febrero de 09 a las 08:02

He respondido una pregunta en otro hilo similar al suyo, consulte el enlace a continuación. dba.stackexchange.com/questions/39252/… -

9 Respuestas

Sí tu puedes. Simplemente vaya a la lista de columnas de salida en la fuente de Excel y establezca el tipo para cada una de las columnas.

Para acceder a la lista de columnas de entrada, haga clic con el botón derecho en la fuente de Excel, seleccione 'Mostrar editor avanzado', haga clic en la pestaña etiquetada 'Propiedades de entrada y salida'.

Una solución potencialmente mejor es utilizar el componente de columna derivada, donde en realidad puede crear columnas "nuevas" para cada columna en Excel. Esto tiene los beneficios de

  1. Tienes más control sobre lo que conviertes.
  2. Puede poner reglas que controlen el cambio (es decir, si es nulo, dame una cadena vacía, pero si hay datos, dame los datos como una cadena)
  3. Su fuente de datos no está vinculada directamente al resto del proceso (es decir, puede cambiar la fuente y el único lugar donde deberá trabajar es en la columna derivada)

Respondido 12 Feb 09, 11:02

Robert: Gracias por tu respuesta. Todavía tengo problemas para ver cómo hacer esto. Estoy usando el componente de origen de Excel que tiene un formulario de columnas, pero esto solo tiene el nombre de cada columna, no el tipo de datos. El administrador de conexión de Excel no tiene un formulario de columnas por lo que puedo ver. - hugh mullally

Creo que va al editor de propiedades incorrecto (la fuente de Excel tiene dos, uno simple y uno avanzado). He actualizado la respuesta con un poco más de aclaración y un paso a paso para llegar al lugar correcto. - Robert Mac Lean

Llegando allí ahora: utilicé el editor avanzado y cambié las columnas de entrada y salida para que todas tuvieran un tipo de datos de DT_WSTR. Sin embargo, los tipos de datos de la columna de salida de error deben coincidir con los tipos de datos de las columnas de entrada, y no parece posible cambiarlos ... ¡Gracias por su continua ayuda! - hugh mullally

¿Por qué se marcó esta pregunta como respondida? El comentario anterior establece claramente que esto no funciona. - jzacharuk

Necesitamos establecer el fuente tipo de columna, no el tipo de salida. - Ingeniero invertido

Según esta entrada del blog, el problema es que el controlador SSIS Excel determina el tipo de datos para cada columna en función de los valores de lectura de las primeras 8 filas:

  • Si los 8 registros principales contienen el mismo número de tipos numéricos y de caracteres, entonces la prioridad es numérica
  • Si la mayoría de los 8 registros principales son numéricos, entonces asigna el tipo de datos como numérico y todos los valores de los caracteres se leen como NULL.
  • Si la mayoría de los 8 registros principales son de tipo carácter, entonces asigna el tipo de datos como cadena y todos los valores numéricos se leen como NULL.

La publicación describe dos cosas que puede hacer para solucionar este problema:

  1. Primero, agregue IMEX=1 al final de la cadena de conexión del controlador de Excel. Esto permitirá que Excel lea los valores como Unicode. Sin embargo, esto no es suficiente si los datos de las primeras 8 filas son numéricos.
  2. En el registro, cambie el valor de HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Nod\Microsoft\Jet\4.0\Engines\Excel\TypeGuessRows a 0. Esto asegurará que el controlador mire todas las filas para determinar el tipo de datos para la columna.

Respondido 13 ago 14, 18:08

Si su archivo de Excel contiene un número en la columna en cuestión en la primera fila de datos, parece que el motor SSIS restablecerá el tipo a un tipo numérico. Seguía reiniciando el mío. Entré en mi archivo de Excel y cambié los números a "Números almacenados como texto" colocando una comilla simple delante de ellos. Ahora se leen como texto.

También noté que SSIS usa la primera fila para IGNORAR lo que el programador ha indicado es el tipo real de los datos (incluso le dije a Excel que formatee toda la columna como TEXTO, pero SSIS aún usaba los datos, que eran un montón de dígitos) y reinícielo. Una vez que lo arreglé al poner una comilla simple en mi archivo de Excel delante del número en la primera fila de datos, pensé que lo haría bien, pero no, hay trabajo adicional.

De hecho, aunque la columna de fuente de datos externa SSIS ahora tiene el tipo DT_WSTR, todavía leerá 43567192 como 4.35671E + 007. Por lo tanto, debe volver a su archivo de Excel y poner comillas simples delante de todos los números.

¡Bastante LAME, Microsoft! Pero ahí está tu solución. No tengo idea de qué hacer si el archivo de Excel no está bajo su control.

Respondido el 23 de Septiembre de 09 a las 18:09

Estaba buscando una solución para un problema similar, pero no encontré nada en Internet. Aunque la mayoría de las soluciones encontradas funcionan en tiempo de diseño, no funcionan cuando desea automatizar su paquete SSIS.

Resolví el problema y lo hice funcionar cambiando las propiedades de "Fuente de Excel". Por defecto el AccessMode la propiedad está configurada para OpenRowSet. Si lo cambia a SQL Command, puede escribir su propio SQL para convertir cualquier columna que desee.

Para mí, SSIS estaba tratando el NDCCode columna como flotante, pero la necesitaba como una cadena y, por lo tanto, utilicé el siguiente SQL:

Select [Site], Cstr([NDCCode]) as NDCCode From [Sheet1$]

enter image description here

enter image description here

Respondido 18 ago 17, 20:08

Estoy votando a favor porque, en teoría, esta solución podría funcionar. Lo probé, pero Windows 8 + Visual Studio 2017 + las últimas ofertas se bloquean cada vez que llego a cierto punto con él. Así que no puedo decirlo con seguridad. EGP

La fuente de Excel es SSIS se comporta como una locura. SSIS determina el tipo de datos en una columna particular leyendo las primeras 10 filas ... de ahí el problema. Si tiene una columna de texto con valores nulos en los primeros 10 roes, SSIS toma el tipo de datos como Int. Con un poco de lucha, aquí hay una solución

  1. Inserte una fila ficticia (preferiblemente la primera fila) en la hoja de trabajo. Prefiero hacer esto a través de una tarea de script, puede considerar usar algún servicio para preprocesar el archivo antes de que SSIS se conecte a él

  2. Con la fila duummy, está seguro de que los tipos de datos se establecerán como necesite

  3. Lea los datos utilizando la fuente de Excel y filtre la fila ficticia antes de llevarla para su procesamiento posterior.

Sé que está un poco en mal estado, pero funciona :)

Respondido 28 Feb 14, 22:02

Podría solucionar este problema. Mientras creaba el paquete SSIS, cambié manualmente la columna específica a texto (Abra el archivo de Excel, seleccione la columna, haga clic derecho en la columna, seleccione las celdas de formato, en la pestaña de números seleccione Texto y guarde el Excel). Ahora cree el paquete SSIS y pruébelo. Funciona. Ahora intente usar el archivo de Excel donde esta columna no se estableció como texto.

Me funcionó y pude ejecutar el paquete con éxito.

Respondido el 26 de junio de 14 a las 03:06

Esto debe resolverse simplemente, simplemente desmarque la casilla "Primera fila como nombres de columna" y todos los datos se recopilarán como tipo de datos de texto. El único inconveniente de esta elección es que debe administrar los nombres de las columnas de los nombres automáticos (columna 1, 2, etc.) y manejar la primera fila que contiene los nombres de las columnas.

Respondido el 11 de diciembre de 19 a las 12:12

Tuve problemas para implementar la solución aquí; pude seguir las instrucciones, pero solo arrojó nuevos errores.

Resolví mis problemas de conversión utilizando una entidad de conversión de datos. Esto se puede encontrar en SSIS Toolbox en Transformaciones de flujo de datos. Coloqué la conversión de datos entre mi fuente de Excel y el destino de OLE DB, vinculé Excel a Data C, Data C a OLE DB, hice doble clic en Data C para que aparezca una lista de las columnas de datos. Le dio a la columna del problema un nuevo Alias ​​y cambió la columna Tipo de datos.

Por último, en las asignaciones del destino OLE DB, utilice el nombre de la columna Alias, en lugar del nombre de la columna de Excel original. Trabajo hecho.

Respondido el 14 de enero de 14 a las 02:01

Parece que olvidó vincular a la solución a la que hace referencia: Ethan

Esta es una elaboración de la sugerencia de Farouq de dos años antes y tiene el mismo problema. - usuario565869

Sí, fue una elaboración, para mostrar todos los pasos necesarios para que el proceso funcione, y funcionó. ¿Lo intentó antes de decidir que estaba mal y necesitaba una votación en contra? - kangacHASHam

Esto tiene el mismo problema que la otra solución (sí, lo probé). El problema es que la fuente de Excel determina el tipo de datos en la ENTRADA en la fuente de Excel. Para cuando llega a la salida o al siguiente objeto como una conversión de datos, es demasiado tarde. En mi caso, si las primeras ocho filas son seis cadenas y dos números, los números son nulos. Intenté arreglarlo usando la solución de Alok B de convertirlo en un comando SQL escribiendo una consulta en su lugar. Esto podría funcionar, pero Windows 8 + Visual Studio 2017 + las últimas ofertas se bloquean cada vez que llego a un cierto punto. - EGP

Puede utilizar un componente de conversión de datos para convertir a los tipos de datos deseados.

Respondido 13 ago 14, 15:08

Si SSIS, en su sabiduría infinita, decide que una columna es numérica, la lectura de valores de texto hará que la fuente de datos falle. No hay oportunidad de convertir los datos en sentido descendente. - usuario565869

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.