Команда OpenRowSet в TSQL возвращает NULLS - PullRequest
6 голосов
/ 26 августа 2009

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

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

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

Просто еще немного информации. Я не могу сделать это с движком JET (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$]')

Ответы [ 5 ]

6 голосов
/ 26 августа 2009

Я заметил, что вы используете драйвер ODBC для Excel. Вы пробовали 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$]')

РЕДАКТИРОВАТЬ: Извините, только что заметил ваш последний абзац. Конечно, драйвер ODBC для Excel по-прежнему работает через механизм JET, так что бы это изменило?

РЕДАКТИРОВАТЬ: Я посмотрел ссылку KB194124, и рекомендуемые им значения реестра являются значениями по умолчанию на моем компьютере, которые я никогда не менял. Я использовал этот метод несколько раз сам без проблем. Может быть, это экологическая проблема?

2 голосов
/ 26 августа 2009

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

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

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

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

1 голос
/ 26 августа 2009

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

0 голосов
/ 06 ноября 2015

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

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

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

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

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

0 голосов
/ 01 октября 2009

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

...