Какво може да бъде по-просто от това да получите данни от таблица на Excel в SQL Server?
Има много начини за изпълнение на тази задача. Можете да използвате Интеграционни услуги (бивш DTS) илиимпорт и експорт wizard, който е същият под капака. Друг начин е да създадете просто приложение ADO.NET . Можете да използвате свързания сървър механизъм, който ви позволява да видите всеки ODBC / OLE DB-достижим обект под формата на таблица (колекция от таблици) или резултат от ad hoc заявка.
Беше, докато 64-битовата архитектура спря да бъде нещо от класа на хай-енд и дойде при лаптопи за разработчици и потребители. Типичният потребител е малко вероятно да инсталира сървър на база данни, докато е нормално разработчикът да има 64-битов SQL Server на 64-битова машина с 32-битов MS Office. В този случай обаче използването на Excel или Access със свързани сървъри със SQL Server може да бъде предизвикателство, тъй като драйверите са 32-битови. Няма налични доставчици за MS Office, въпреки че имам инсталиран такъв на моя компютър.
По този начин опит за използване на Excel или Access с свързани сървъри със SQL Server, както е описано в документацията, ще доведе до следната грешка:
Съобщение 7302, ниво 16, състояние 1, ред 1
Не може да се създаде екземпляр на доставчик на OLE DB «Microsoft.ACE.OLEDB.12.0» за свързан сървър…
И така, какво да правя?
Инсталирайте 64-битов доставчик, който е достъпен за изтегляне в Microsoft Access Database Engine 2010 Redistributable. Получаваме следната грешка по време на инсталационния процес:
Ако 32-битовият Office не беше инсталиран на компютъра, нямаше да получите това предупреждение.
Трябва ли да избирам между 64-битова или 32-битова версия на MS Office и 64-битова или 32-битова версия на SQL Server? Деинсталирането на една версия и инсталирането на друга не е гъвкаво решение. Освен това не винаги е възможно. Нека да разгледаме въпроса, който човек е повдигнал в MSDN:
Базата данни на MS Access е производствена среда на сайта на клиента и не е опция за мен да я деинсталирам и да инсталирам 64-битова версия. Освен това не е опция да деинсталирате съществуващия 64-битов SQL Server и да инсталирате 32-битовата версия, разбира се. Допълнителна инсталация на 32-битов SQL Server, предоставяща само връзка към MS Access, би била единствената възможност тогава. Намирам това за доста ужасно.
Не разбирам тази част.
Тъй като няма 64-битов Jet, трябва да изтеглите и инсталирате 64-битовата версия на «Microsoft Access Database Engine 2010 Redistributable». — Благодаря за отговора ви, но когато инсталирам AccessDatabaseEngine_X64.exe получавам следната грешка (снимка 1) — Моля, вижте тази KB статия: support.microsoft.com/kb/2269468 — Статията във връзката в последното ви съобщение казва да деинсталирате всички 32-битови продукти на Office. Това няма смисъл за мен, защото целта е да се свърже с 32-битовата база данни на MS Access... — Трябва да инсталирате 64-битовата версия на „Microsoft ACE OLEDB Provider“, за да се свържете с файл на Access (32-битов или 64-битов) от SQL Server. — Но аз се опитах да инсталирам 64-битовия драйвер, но ми дава грешка при инсталиране... — Предишната KB статия обяснява причината и предоставя решение, можете да се обърнете към нея. — Вие ме водите в кръгове.
Е, проблемът е 64-битовата версия на Microsoft ACE OLEDB Provider да работи с 32-битовия Office. Защо не е възможно да се направи това директно е голям въпрос. Има много информация по тази тема:
Фактът, че не могат да ни принуди да компилираме две различни версии на нашето приложение; един специално за x86 платформа и един за x64 платформа. След това трябва по някакъв начин да определим коя версия на ACE драйвера е инсталирана, за да знаем коя версия (32 или 64 бита) на нашето приложение да инсталираме. Животът би бил много по-опростен, ако можехме просто да компилираме нашето приложение за AnyCPU по подразбиране и след това беше позволено да бъдат инсталирани и 32, и 64 доставчици на данни... Защо не могат да съществуват съвместно 32 и 64 битов ACE? — Основа се на факта, че Microsoft не поддържа паралелно инсталиране на 32 и 64-битов Microsoft Office 2010 или техните зависими компоненти... — Съжалявам, но това не е много полезен отговор на въпроса. В:Защо 32-битовите и 64-битовите версии на Microsoft Access Database Engine 2010 Redistributable (AccessDatabaseEngine.exe и AccessDatabaseEngine_X64.exe) и двете не могат да бъдат инсталирани на една и съща машина? О:Microsoft не поддържа паралелна инсталация на 32 и 64-битов Microsoft Office 2010. Това не е отговор, това е просто повтаряне на въпроса с други думи. Въпрос:Защо не мога да направя това? О:Защото не го подкрепяме. Въпрос:Защо не можете да го подкрепите? О:Защото не го поддържаме.
Като заобиколно решение използвах AccessDatabaseEngine_X64.exe с /passive ключ, който позволява 64-битовата версия на доставчика да съществува едновременно с 32-битовата версия на Office. Трябва да се отбележи, че Microsoft не поддържа този метод официално. Освен това има предупреждения относно възможни проблеми със съвместимостта.
Когато инсталирах драйвера AccessDatabaseEngine_x64.exe ... MS Office Pro Plus стартира процес на конфигуриране на MS, който може да отнеме до минута или две, преди да се отвори документ или програма на Office . Ако Office 2010 32 bit е инсталиран и ако 64-bit ace е инсталиран с /passive , след това **всеки** път, когато стартирате Access 2010, получавате рутина за автоматична инсталация, която се нулира до 32-битовите драйвери за офис .
В моя случай (Office 2013 Pro Plus, SQL Server 2012 Developer Ed., Windows 8.1) нямаше видими проблеми (почукване на дърво). Все пак искам да добавя, че е както е и без никакви задължения.
Изтеглете AccessDatabaseEngine_x64.exe, създайте точка за възстановяване на системата (изглежда, че се създава автоматично при актуализиране на компоненти на Office) и стартирайте от командния ред. Ето възможните ключове:
За разлика от снимка 2, инсталацията е стартирана
След това щракнете върху Обновяване в контекстното меню на доставчиците:
Създадох прост xslx файл много бързо:
В SQL Server създайте свързан сървър на този Excel:
ако съществува (изберете 1 от sys.servers, където име ='XlsLnkSrv') exec sp_dropserver @server ='XlsLnkSrv', @droplogins ='droplogins'exec sp_addlinkedserver @server ='XlsLnkSrv', ACE ='XlsLnkSrv', ACE , @provider ='Microsoft.ACE.OLEDB.12.0', @datasrc ='C:\Temp\Sample.xlsx', @provstr ='Excel 12.0; HDR=Да'
Сценарий 1
Прочетете:
изберете * от openquery (XlsLnkSrv, 'Изберете * от [Sheet1$]')
Сценарий 2
Успешен ли е? Не!
Съобщение 7399, ниво 16, състояние 1, ред 1
Доставчикът на OLE DB «Microsoft.ACE.OLEDB.12.0» за свързан сървър «XlsLnkSrv» съобщи за грешка. Доставчикът не даде никаква информация за грешката.
Съобщение 7303, ниво 16, състояние 1, ред 1
Не може да инициализира обекта източник на данни на доставчика на OLE DB «Microsoft.ACE.OLEDB.12.0» за свързан сървър «XlsLnkSrv».
Все пак е успешно!
По същия начин,
изберете * от openrowset('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;Database=C:\Temp\Sample.xlsx;HDR=Да', 'Изберете * от [Sheet1$]')предварително>Първо трябва да направим следното:
exec sp_configure 'показване на разширени опции', 1;reconfigure;exec sp_configure 'Ad Hoc разпределени заявки', 1;reconfigureСценарий 3
В заключение бих искал да отбележа, че 64-битовият доставчик замени 32-битовия. Ако създадем връзка за Sample.xslsx в Data Flow на пакета DTS, ще получим неуспешна инициализация на Microsoft Office 12.0 Access Database Engine OLE DB доставчик, което е логически правилно, тъй като devenv.exe е 32-битов, докато доставчикът е 64-битов. За да възстановите поведението, е необходимо да възстановите 32-битовия доставчик на Office (тук). В този случай обаче не можем да използваме свързания сървър. За да накарате свързания сървър да работи, отидете в началото на статията.