2009-08-26 3 views
6

Проводится какое-то время и продолжайте ударять по кирпичной стене. Я импортирую файлы xls в временные таблицы через команду OpenRowset. Теперь у меня есть проблема, когда я пытаюсь импортировать определенный столбец, имеет значения диапазона, но наиболее распространенными являются следующие. Столбцы, структурированные как длинные номера, то есть 15598, и некоторые столбцы в виде строк, то есть 15598-E.Команда OpenRowSet в TSQL возвращает NULLS

Теперь openrowset читает строку версии без проблем, но сообщает номер версии как NULL. Я прочитал (http://www.sqldts.com/254.aspx), что openrowset имеет эту проблему, и автор говорит о внедрении «HDR = YES; IMEX = 1» в строку запроса, но это не работает для меня вообще.

Неужели кто-нибудь из вас, ребята, столкнулся с этим?

Просто еще одна информация. Я не могу сделать это с помощью реактивного двигателя (Microsoft.Jet.OLEDB.4.0), так это то, что мой запрос выглядит следующим образом:

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

Теперь вы знаете, почему люди ETL ненавидят Excel для импорта! – HLGEM

ответ

6

Я замечаю, что вы используете драйвер Excel ODBC. Вы пробовали поставщика JET OLEDB с эквивалентной строкой соединения?

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: Извините, просто заметил ваш последний абзац. Разумеется, драйвер ODBC Excel по-прежнему работает через JET-движок, и какая разница?

EDIT: Я просмотрел ссылку KB194124, и значения реестра, которые она рекомендует, являются значениями по умолчанию на моей машине, которые я никогда не изменял. Я использовал этот метод несколько раз без проблем. Может быть, это экологическая проблема?

+0

не проблема, посмотрите http://stackoverflow.com/questions/1178243/what-is-the-difference-between-odbc-and-oledb для получения дополнительной информации – StevenMcD

+0

спасибо! Я очень ценю это! – StevenMcD

+0

+1. Через год после этого был опубликован, и он решил тот же вопрос для меня. – 8kb

1

Мы пришли по тому же вопросу. К сожалению, мы также не нашли решения. Есть дополнительная информация here, которая указывает, что может быть исправление реестра.

+0

cool, спасибо за ссылку – StevenMcD

2

Если вы не против открытия файла в Excel, возьмите те столбцы, которые имеют проблемы, выберите столбец и сделать

Data -> Текст по столбцам -> Далее -> Далее -> Текст

Сохраните таблицу, и все они должны прийти в виде текста в OPENROWSET

Я нашел с помощью CSV-файлов вместо Excel, открываемые путем создания связанного сервера, и настройка формата файлов в schema.ini более практичный подход для обработки импорта, подобный этому, с помощью этого метода вы можете объяснить Выберите формат каждого столбца.

0

У меня была та же проблема. Я зафиксировал его, вырезая и вставив строку, содержащую столбец со строковым/числовым значением (например, 123ABC) в позиции первого ряда листа. По какой-то причине T-SQL считывает первую строку и предполагает, что все значения являются числовыми.

0

Ответ SqlACID в этой ссылке работал большой [https://wikigurus.com/Article/Show/185717/OpenRowSet-command-in-TSQL-is-returning-NULLS]: -

Если вы не против открытия файла в Excel, возьмите те столбцы, которые имеют проблемы, выберите столбец и сделать

Данные -> Текст по столбцам -> Далее -> Далее -> Текст

Сохраните таблицу, и все они должны прийти в виде текста в OPENROWSET

Я нашел с помощью CSV-файлов вместо Excel, открываемый настройка связанного сервера, и настройки формата файлов в schema.ini - более практичный подход для обработки импорта, подобный этому, с помощью этого метода вы можете явно выбрать формат каждого столбца.