понедельник, 13 февраля 2012 г.

Загрузка из Excel в MS SQL Server (несколько способов)


Несколько примеров работы из MS SQL Server  с таблицами формата Excel(.xls,.xlsx):


1)С использованием функции OPENROWSET или с OPENDATASOURCE:
SELECT * FROM OPENROWSET('MSDASQL',
'Driver={Microsoft Excel Driver (*.xls)};
DBQ=[C:\gr_otchet.xls]', 'SELECT * FROM [Sheet1$A8:D10000]'
Пример для OPENDATASOURCE из BOL:
SELECT * FROM OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0',
'Data Source=C:\DataFolder\Documents\TestExcel.xls;Extended Properties=EXCEL 5.0')...[Sheet1$] ;
Одна из распространенных  проблем, это отсутствие драйверов под х64 платформу, или установка х32 битных под х64 систему. Например, драйверов Microsoft.Jet.OleDB нет 64 битных,в этом случае  можно использовать другие драйвера, к примеру  Microsoft.ACE.OLEDB.12.0.

Не забудьте только про Примечание из  BOL:
Функция OPENROWSET  или  OPENDATASOURCE может быть использована для доступа к удаленным данным из источников данных OLE DB только в том случае, если для заданного поставщика параметр реестра DisallowAdhocAccess явно установлен в 0 и включен параметр Ad Hoc Distributed Queries расширенной настройки. Если эти параметры не установлены, поведение по умолчанию запрещает нерегламентированный доступ.
Если параметр Ad Hoc Distributed Queries выключен, то  об будет информационное сообщение. Включение параметра осуществляется через хранимую процедуру sp_configure.
sp_configure 'Ad Hoc Distributed Queries', 1;
RECONFIGURE;
GO

2) Второй спосб через Linkedserver и ODBC драйвер.
1-ый способ хорошо, когда необходимо использовать разово, для частого и широко использования лучше использовать технологию связанного сервера(Linked Server)
Для этого необходимо установить на сервере MS SQL Server ODBC драйвер а для Excel, затем создать источник данных( Администрирование ->Источники данных)

Указывает имя источника данных ,версию Excel и сам файл.
Сохраняем источник.
После этого создаем связанный сервер LinkedServed (связанный сервер):



Указываем имя нашего  связанного сервера и имя созданного нами раннего ODBC источника.
Сохраняем.
Теперь можно выполнять запросы к нашему связанному серверу, к примеру:
select * from openquery(excel,'select * from [sheet1$]') – получение всех данныз из экселя
select * from openquery(excel,'select * from [Sheet1$A10:D2]') – получение данных диапозона $A10:D2
select * from openquery(excel,'select * from [Sheet1$A10:D]') – получение данных диапозона с A10:D до конца файла.

3) Еще одни, способ, когда необходим импорт разово, то можно использовать «SQL Server Import and Export Wizard»:
Выделяем БД,  правая кнопка, Задачи, Выбираем пункт Импорт или Экспорт:
Выбираем источник данных, наш файл Excel, версию Excel. :


Выбираем куда копировать данные, указываем таблицу назначение .
После этого можно пакет запустить немедленно или его сохранить для дальнейшего использования.
4) Кстати, 4 способ, это как раз создание пакета SSIS в Microsoft Visual Studio, результатом которого так же будет пакет, похожий на то, что было создано в варианте 3
Делается он просто
Выбирается Элемент потока управления

Затем выбирается источник и сервер назначения:

В источнике соединений создается новое соединение с нашим файлом Excel, в  Назначение указываем наш MS SQL Server, указываем таблицу, сопоставляем столбцы:

После этого сохраняем пакет, и его запускаем.
Пакет создали  и должен работать.
Удачи .

12 комментариев :

  1. нужно жирным 4 способ выделить

    ОтветитьУдалить
  2. Подскажите пожалуйста, а как связать Excel в качестве сервера если у него пароль на открытие? Или как через способ 1( с помощью OLEDB) сделать запрос к Excel или как открыть его если стоит пароль

    ОтветитьУдалить
  3. Огромное спасибо. Пытался выкачать из Excel 2 дня. С Вашими инструкцией всё сделал за 10 минут. Респектосик )

    ОтветитьУдалить
  4. Подскажите пожалуйста, использую ваш вариант номер 3. Мне не предлогается выбор таблицы, только базы данных. Как быть ?

    ОтветитьУдалить
  5. Подскажите, для 3-го варианта нужен ли сам Excel?

    ОтветитьУдалить
    Ответы
    1. нет, не нужен, у вас должны стоять Management Studio, при старте Wizart-а будет возможность указать Excel файл.

      Удалить
  6. А как сделать так, чтобы у меня при открытии или обращении к таблице excel из ms sql всегда были актуальные данные?

    ОтветитьУдалить
    Ответы
    1. в каком смысле актуальные данные ? Это вам надо уже заботиться , чтобы в Excel были актуальные данные, далее загружаете в MS SQL Server изапросов сортируете на актуальные данные

      Удалить
  7. как обновить импортированные данные из эксель в SQL server ?

    ОтветитьУдалить