2009-08-26 18 views
6

Investigado desde hace un tiempo y sigue golpeando una pared de ladrillo. Importación desde archivos xls a tablas temporales a través del comando OpenRowset. Ahora tengo un problema donde estoy tratando de importar una determinada columna tiene un rango de valores, pero los más comunes son los siguientes. Columnas estructuradas como números largos, es decir, 15598 y algunas columnas como cadenas, es decir, 15598-E.El comando OpenRowSet en TSQL está retornando NULLS

Ahora el openrowset está leyendo la versión de cadena sin problema pero informa la versión del número como NULL. Leí (http://www.sqldts.com/254.aspx) que openrowset tiene ese problema y el autor habla de implementar "HDR = YES; IMEX = 1" en la cadena de consulta, pero eso no funciona para nada.

¿Alguno de ustedes ha encontrado esto?

Solo algo más de información también. Puede que no hago esto con el motor a reacción (Microsoft.Jet.OleDb.4.0) así que esto es lo que parece mi consulta como:

SELECT * 
FROM 
    OPENROWSET('MSDASQL' 
       , 'Driver=Microsoft Excel Driver (*.xls);HDR=YES;IMEX=1;DBQ=C:\ImportFile.xls;' 
      , 'SELECT * FROM [Sheet1$]') 
+2

¡Ahora sabe por qué la gente de ETL odia Excel por las importaciones! – HLGEM

Respuesta

6

Me doy cuenta de que está utilizando el controlador ODBC de Excel. ¿Has probado el proveedor JET OLEDB con la cadena de conexión equivalente?

select * from openrowset(
    'Microsoft.Jet.OLEDB.4.0', 
    'Data Source=C:\ImportFile.xls;Extended Properties="Excel 8.0;HDR=Yes;IMEX=1"', 
    'SELECT * FROM [Sheet1$]') 

EDIT: siento, sólo se dio cuenta de que su último párrafo. Seguramente, el controlador ODBC de Excel todavía funciona a través del motor JET, entonces ¿qué diferencia haría?

EDIT: He mirado el enlace KB194124, y los valores de registro que recomienda son los valores predeterminados en mi máquina, que nunca he cambiado. He usado el método anterior varias veces sin problemas. Tal vez es un problema ambiental?

+0

no hay problema, echa un vistazo a http://stackoverflow.com/questions/1178243/what-is-the-difference-between-odbc-and-oledb para obtener más información – StevenMcD

+0

gracias! ¡Realmente lo aprecio! – StevenMcD

+0

+1. Un año después de que esto se publicó y resolvió el mismo problema para mí. – 8kb

1

Nos hemos encontrado con el mismo problema. Lamentablemente, tampoco hemos encontrado una solución. Hay más información here que indica que puede haber una corrección de registro.

+0

genial, gracias por el enlace – StevenMcD

2

Si no le importa abrir el archivo en Excel, tome las columnas que tienen el problema, seleccione la columna y hacer

de datos -> texto en columnas -> Siguiente -> Siguiente -> texto

Guardar la hoja de cálculo y todos ellos deben venir como texto en OPENROWSET

que he encontrado usando CSV archivos en lugar de Excel, abiertas por la creación de un servidor vinculado, y la configuración del formato de los archivos en schema.ini, un enfoque más práctico para manejar importaciones como esta, con ese método puede explici Elija el formato de cada columna.

0

Tuve el mismo problema. Lo arreglé cortando y pegando una fila que contiene una columna con el valor de cadena/numérico (por ejemplo, 123ABC) en la posición de la primera fila de la hoja. Por algún motivo, T-SQL lee la primera fila y asume que todos los valores son numéricos.

0

Respuesta de SqlACID en este enlace funcionó muy bien [https://wikigurus.com/Article/Show/185717/OpenRowSet-command-in-TSQL-is-returning-NULLS]: -

Si no le importa abrir el archivo en Excel, tome las columnas que tienen el problema, seleccione la columna y hacer

datos -> texto en columnas -> Siguiente -> Siguiente -> Texto

Guardar la hoja de cálculo y todos ellos deben venir como texto en OPENROWSET

que he encontrado usando CSV archivos en lugar de Excel, abierto por configurar un Servidor Vinculado, y configurar el formato de los archivos en schema.ini, un enfoque más práctico para manejar importaciones como esta, con ese método usted puede elegir explícitamente el formato de cada columna.