sql server - tables - Importación de Excel de SSIS que fuerza el tipo de columna incorrecta
ssis excel destination create new file (15)
- Haga clic en Archivo en el menú de la cinta, y luego haga clic en Opciones.
Haga clic en Avanzado y luego en Al calcular este libro de trabajo, seleccione la casilla Establecer precisión como se muestra y luego haga clic en Aceptar.
Haga clic en Aceptar.
En la hoja de trabajo, seleccione las celdas que desea formatear.
En la pestaña Inicio, haga clic en la imagen del botón iniciador del cuadro de diálogo junto a Número.
En el cuadro Categoría, haga clic en Número.
En el cuadro Lugares decimales, ingrese la cantidad de decimales que desea visualizar.
Estoy tratando de importar una hoja de cálculo a nuestra base de datos usando SSIS. Por algún motivo, SSIS desea creer que dos de las columnas son de tipo Doble, cuando contienen datos de caracteres. Intenté reasignar las columnas para que sean nvarchar (255) pero todavía no desea seleccionar los datos que cree que son dobles, porque hay caracteres en él. Si trato de editar el paquete de SSIS y cambiar los tipos de columna en la fuente de Excel, no me permitirá cambiar el tipo de columnas en la salida de error y me da un error si las columnas de salida normal y de salida de error no lo hacen partido.
¿Por qué SSIS insiste en que estas columnas son dobles? ¿Cómo puedo obligarlo a darse cuenta de que estas son las cuerdas? ¿Por qué todo desde Microsoft tiene que no funcionar correctamente?
EDITAR: Encontré esto: http://support.microsoft.com/kb/236605
Clasifiqué mis datos para que los tipos de datos mixtos estuvieran en la parte superior, y adivinen qué: el problema se revirtió . En lugar de no importar datos de caracteres, dejó de importar datos puramente numéricos. Al parecer, alguien no cree que 12345 se pueda representar como una cadena ...
; IMEX = 1; no siempre funciona ... Todo sobre los tipos de datos mixtos en Excel: tipos de datos mixtos en la columna de Excel
Bueno IMEX = 1 no funcionó para mí. Tampoco la sugerencia de Reynier Booysen. (No sé si hace una diferencia, pero estoy usando SQL Server 2008r2). En http://social.msdn.microsoft.com/Forums/en-US/sqlintegrationservices/thread/78b87712-8ffe-4c72-914b-f1c031ba6c75 encontrará una buena explicación de algunas soluciones y algunas explicaciones de por qué IMEX = 1 está limitado a las primeras ocho filas de cada hoja de cálculo. http://social.msdn.microsoft.com/Forums/en-US/sqlintegrationservices/thread/78b87712-8ffe-4c72-914b-f1c031ba6c75
Espero que esto ayude
Estaba golpeando mi cabeza contra la pared con este problema por un tiempo. En nuestro entorno, consumimos archivos de precios de nuestros proveedores en varios formatos, algunos de los cuales tienen más de un millón de registros. Este problema generalmente ocurre donde:
- Las filas escaneadas por el controlador OLEDB parecen contener números, pero contienen valores mixtos más adelante en el conjunto de registros, o
- Los campos solo contienen números, pero la fuente tiene algunos formateados como texto (generalmente archivos de Excel).
El problema es que incluso si configura su columna de entrada externa para el tipo de datos deseado, el archivo se escanea cada vez que ejecuta el paquete y se cambia dinámicamente a lo que el controlador OLEDB crea que debería ser el campo.
Nuestros archivos de origen generalmente contienen encabezados de campo (texto) y precios (campos numéricos), lo que me brinda una solución fácil:
Primer paso:
- Cambie su declaración de SQL para incluir los campos de encabezado. Esto obliga a SSIS a ver todos los campos como texto, incluidos los campos de precio.
Para campos mixtos:
- Su problema inicial está resuelto porque sus campos ahora son texto, pero todavía tiene una fila de encabezado en su salida.
- Evite que la fila del encabezado llegue a su salida cambiando la cláusula WHERE de SQL para excluir los valores del encabezado, por ejemplo "WHERE NOT ([F4] = ''Price'')"
Para campos numéricos:
Utilizando el editor avanzado para el origen de OLE DB, configure la columna de salida para el campo de precio (o cualquier otro campo numérico) en un tipo de datos numérico. Esto hace que falle cualquier registro que contenga texto en estos campos, incluido el registro del encabezado, pero obliga a una conversión en valores numéricos guardados como texto.
Establezca la salida de error para ignorar las fallas en sus campos numéricos.
Alternativamente, si aún necesita errores en los campos numéricos redirigidos, elimine la fila del encabezado cambiando la cláusula SQL WHERE para excluir los valores del encabezado,
- Establezca la salida de error para redirigir fallas en este campo.
Obviamente, este método solo funciona donde tienes campos de encabezado, pero espero que esto ayude a algunos de ustedes.
Esto funcionó para mí. Seleccione la columna problemática en Excel: resalte toda la columna. Cambie el formato a "Texto". Guarde el archivo de Excel.
En su paquete SSIS, vaya al panel Flujo de datos para su importación. Haga doble clic en el nodo Fuente de Excel. Debería advertirte que los tipos han cambiado y preguntarte si quieres reasignarlos. Haga clic en Sí. La ejecución ahora debería funcionar y traer todos los valores.
Nota: Estoy usando Excel 2013 y Visual Studio 2015, pero asumo que estas instrucciones también funcionarían para versiones anteriores.
He usado la siguiente receta:
- Importar datos de Excel a Access
- Importar datos desde Access a SQL Server
Y funcionó para mí...
He visto este problema antes, Excel es el problema, no el SSIS. Excel muestrea las primeras filas y luego infiere el tipo de datos incluso si lo configura explícitamente en texto. Lo que debe hacer es poner esto en la cadena de conexión de archivos de Excel en el paquete SSIS. Esta instrucción le dice a Excel que las columnas contienen tipos de datos mixtos y sugiere que haga una comprobación adicional antes de decidir que la columna es de tipo numérico cuando en realidad no lo es.
;Extended Properties="IMEX=1"
Debería funcionar con esto (en la mayoría de los casos). Lo más seguro es exportar los datos de Excel a un texto delimitado por tabulaciones y usar SSIS para importar eso.
Opción 1. Use Visual Basic para iterar a través de cada columna y formatee cada columna como Texto.
Use el menú Texto a columnas, no cambie la delimitación y cambie "General" a "Texto"
Otra solución consiste en ordenar la hoja de cálculo con los datos de los caracteres en la parte superior, lo que hace que Excel vea la columna como una cadena e importar todo como tal.
Puede convertir (es decir, forzar) los datos de la columna al texto ... Intente esto (Nota: estas instrucciones se basan en Excel 2007) ...
Los siguientes pasos deben obligar a Excel a tratar la columna como texto:
Abra su hoja de cálculo con Excel.
Seleccione la columna completa que contiene sus "datos en su mayoría numéricos" haciendo clic en el encabezado de la columna.
Haga clic en la pestaña Datos en el menú de la cinta.
Seleccionar texto en columnas. Esto abrirá el Asistente Convertir texto en columnas.
-En el paso 1: haga clic en Siguiente
-En el paso 2: haga clic en Siguiente
-En el paso 3: seleccione texto y haga clic en Finalizar
Guarde su hoja de Excel.
Vuelva a intentar la importación utilizando el Asistente para importación de datos de SQL Server 2005.
Además, aquí hay un enlace a otra pregunta que tiene respuestas adicionales:
El Asistente para importación de datos no le gusta el tipo de datos que elijo para una columna
Si hay varias columnas en la hoja de cálculo de Excel con el mismo nombre, se produce este tipo de error. El paquete funcionará después de hacer que el nombre de la columna sea distinto. En algún momento, las columnas ocultas se ignoran al verificar los nombres de los columnn.
También puede modificar el registro para ver más valores que solo las primeras 8 filas. He usado este método y funciona bastante bien.
Tuve el mismo problema, varios valores de tipo de datos en una sola columna, el paquete solo carga valores numéricos. Permanece todo actualizado como nulo.
Solución
Para solucionar esto, cambiar el tipo de datos de Excel es una de las soluciones. En Excel Copie los datos de la columna y péguelos en un archivo diferente. Elimine esa columna e inserte una nueva columna como Tipo de datos de texto y pegue los datos copiados en una nueva columna.
Ahora, en el paquete ssis, elimine y vuelva a crear la fuente de Excel y la tabla de destino, cambie el tipo de datos de la columna como varchar .
Esto funcionará
Una cosa que no se menciona en la respuesta aceptada es que el parámetro "IMEX = 1" tiene que ir dentro de la porción citada de:
...;Extended Properties="...";
Yo tuve el mismo problema. El problema está en la tarea de Excel Source . Cuando configure esta tarea por primera vez, la tarea se conectará al archivo Excel especificado (a través de la conexión de Excel) y decidirá en qué tipo se basa cada columna en la hoja de cálculo actual.
Por lo tanto, si configura la tarea de origen de Excel , solo asegúrese de que las columnas que deberían ser texto solo tengan texto en la columna. Esto significa que la tarea de origen de Excel siempre supondrá que cualquier hoja de cálculo posterior tendrá el mismo formato y leerá 12345 como texto porque la columna era texto cuando se configuró la tarea.
Espero que tenga sentido!