Проблема с загрузкой листов Excel в sqlserver - PullRequest
0 голосов
/ 13 июля 2010

Мне нужно загрузить лист Excel в базу данных. Что я делаю с запросом

SELECT * INTO temp FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
'Excel 8.0;Database=C:\Dokumente und Einstellungen\l.varada\Desktop\BA-Control.xls',
    'SELECT * FROM [qry_BA_Controlling (Report)$]')

Здесь C: \ Dokumente und Einstellungen \ l.varada \ Desktop \ BA-Control.xls - это путь, из которого необходимо получить файл Excel. qry_BA_Controlling (Report) - это имя рабочего листа.

Таким образом, при выполнении запроса создается таблица с именем temp. С записями, которые заполняются из Excel.

Теперь у меня есть поле даты в Excel. иногда значения этого поля не загружаются должным образом во временную таблицу. Значения для этого поля даты установлены в NULL, хотя они имеют значения в EXCEL.

EDIT Я изменил свой запрос так,

Insert into temp Select * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 
    'Excel 8.0;Database=C:\Dokumente und Einstellungen\l.varada\Desktop\BA-Control.xls',
     HDR=YES', 'SELECT * FROM [qry_BA_Controlling (Report)$]')

Здесь temp - это существующая таблица, я определил тип даты поля [дата создания] для varchar и загрузил Excel. Затем я использовал convert , чтобы изменить тип данных на правильный формат.

update temp set [Creation date] = CONVERT (varchar,[Creation date],101)

Даже сейчас он заполняет значения NULL. Или это преобразование необходимо выполнить при загрузке. если да, пожалуйста, дайте мне знать.

Я думаю, что причина этого в том, что первые несколько значений этого столбца являются пробелами, и после этого у него есть значения. Поскольку он определяет тип данных путем проверки первых нескольких строк. Затем он присваивает NULL. Пожалуйста, предложите мне альтернатива.

Ответы [ 2 ]

0 голосов
/ 24 августа 2010

Я изменил запрос таким образом, что теперь он может импортировать данные из Excel.

EXEC ('SELECT * INTO temp FROM OPENROWSET (' 'Microsoft.Jet.OLEDB.4.0' ',''Excel 8.0; База данных =' + @ba_bm_status + '; HDR = YES; IMEX = 1' ',' + '' 'SELECT * FROM [qry_BA_Controlling (Report) $]' ')');

Я включил IMEX = 1, который говорит водителю использовать режим импорта.

0 голосов
/ 13 июля 2010

Во-первых, остерегайтесь, этот подход не будет работать на 64-разрядных выпусках SQL Server, поскольку отсутствует драйвер x64 для MS Excel. Я видел, как люди сталкивались с этим, когда писали что-то на 32-битной версии, а затем развертывали на x64 в рабочей среде.

Вы используете SELECT INTO, что, я думаю, означает, что драйвер Excel просматривает первые 100 строк (или аналогичные) и определяет, что это поле является датой.

Я думаю, что наиболее вероятно, что SQL Server тогда неправильно форматирует дату, вы можете обнаружить, что значения, имеющие значение NULL, не соответствуют американскому форматированию даты и времени. Поэтому мы (европейцы) примем 31/7/2010, однако это недопустимый формат MM / dd / yyyy.

Я бы предложил предварительно определить временную таблицу со всеми полями int, float или varchar. Затем вручную конвертируйте их (используя удобный вид) в правильные типы. Если я прав в том, что формат даты является проблемой, вы можете использовать функцию CONVERT для принудительного использования правильного формата даты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...