Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

32-Bit-Excel und 64-Bit-SQL-Server

Was könnte einfacher sein, als Daten aus einer Excel-Tabelle in SQL Server zu bekommen?

Es gibt viele Möglichkeiten, diese Aufgabe zu erfüllen. Sie können Integrationsdienste nutzen (früher DTS) oder Import und Export Zauberer, der unter der Haube gleich ist. Eine andere Möglichkeit besteht darin, eine einfache ADO.NET-App zu erstellen . Sie können den Linked Server verwenden Mechanismus, mit dem Sie jedes ODBC / OLE DB-erreichbare Objekt in Form einer Tabelle (einer Sammlung von Tabellen) oder als Ergebnis einer Ad-hoc-Abfrage anzeigen können.

Bis die 64-Bit-Architektur aufhörte, etwas aus der High-End-Klasse zu sein und auf die Laptops der Entwickler und Benutzer kam. Ein typischer Benutzer wird wahrscheinlich keinen Datenbankserver installieren, während es für einen Entwickler normal ist, einen 64-Bit-SQL-Server auf einem 64-Bit-Computer mit 32-Bit-MS Office zu haben. In diesem Fall kann die Verwendung von Excel oder Access mit SQL Server-Verbindungsservern jedoch eine Herausforderung darstellen, da es sich um 32-Bit-Treiber handelt. Für MS Office sind keine Anbieter verfügbar, obwohl ich einen auf meinem PC installiert habe.

Daher führt ein Versuch, Excel oder Access mit SQL Server-Verbindungsservern zu verwenden, wie in der Dokumentation beschrieben, zu folgendem Fehler:

Nachricht 7302, Ebene 16, Status 1, Zeile 1

Es kann keine Instanz des OLE DB-Anbieters „Microsoft.ACE.OLEDB.12.0“ für den Verbindungsserver erstellt werden…

Also, was tun?

Installieren Sie den 64-Bit-Anbieter, der unter Microsoft Access Database Engine 2010 Redistributable zum Download verfügbar ist. Während des Installationsvorgangs erhalten wir die folgende Fehlermeldung:

Wenn 32-Bit-Office nicht auf dem Computer installiert wäre, würden Sie diese Warnung nicht erhalten.

Soll ich zwischen der 64-Bit- oder 32-Bit-Version von MS Office und der 64-Bit- oder 32-Bit-Version von SQL Server wählen? Eine Version zu deinstallieren und eine andere zu installieren, ist keine flexible Lösung. Außerdem ist es nicht immer möglich. Werfen wir einen Blick auf die Frage, die eine Person auf MSDN gestellt hat:

Die MS Access-Datenbank ist eine Produktionsumgebung beim Kunden, und es ist keine Option für mich, sie zu deinstallieren und eine 64-Bit-Version zu installieren. Es ist natürlich auch keine Option, den vorhandenen SQL Server 64-Bit zu deinstallieren und die 32-Bit-Version zu installieren. Eine zusätzliche Installation eines SQL Servers 32 Bit, der nur die Verbindung zu MS Access herstellt, wäre dann die einzige Option. Ich finde das ziemlich schrecklich.

Ich verstehe diesen Teil nicht.

Da es kein 64-Bit-Jet gibt, müssen Sie die 64-Bit-Version von «Microsoft Access Database Engine 2010 Redistributable» herunterladen und installieren. Danke für Ihre Antwort, aber wenn ich die AccessDatabaseEngine_X64.exe installiere, erhalte ich die folgende Fehlermeldung (Bild 1) Bitte lesen Sie diesen KB-Artikel: support.microsoft.com/kb/2269468 Der Artikel im Link in Ihrer letzten Nachricht weist darauf hin, alle Office 32-Bit-Produkte zu deinstallieren. Das ergibt für mich keinen Sinn, da das Ziel darin besteht, eine Verbindung zur 32-Bit-MS-Access-Datenbank herzustellen… Sie müssen die 64-Bit-Version von „Microsoft ACE OLEDB Provider“ installieren, um eine Verbindung zu einer Access-Datei (32-Bit oder 64-Bit) von SQL Server herzustellen. Aber ich habe versucht, den 64-Bit-Treiber zu installieren, aber er gibt mir einen Installationsfehler … Der vorherige KB-Artikel erläutert die Ursache und bietet die Lösung, Sie können darauf verweisen. Du führst mich im Kreis.

Nun, das Problem besteht darin, die 64-Bit-Version von Microsoft ACE OLEDB Provider mit dem 32-Bit-Office funktionieren zu lassen. Warum dies nicht direkt möglich ist, ist eine große Frage. Zu diesem Thema gibt es viele Informationen:

Die Tatsache, dass sie dies nicht können, zwingt uns, zwei verschiedene Versionen unserer Anwendung zu kompilieren; eine speziell für die x86-Plattform und eine für die x64-Plattform. Dann müssen wir irgendwie feststellen, welche Version des ACE-Treibers installiert ist, damit wir wissen, welche Version (32 oder 64 Bit) unserer Anwendung installiert werden soll. Das Leben wäre viel einfacher, wenn wir unsere App einfach für die Standard-AnyCPU kompilieren könnten und dann sowohl 32- als auch 64-Datenprovider installieren dürften … Warum können 32- und 64-Bit-ACE nicht nebeneinander existieren? Es basiert auf der Tatsache, dass Microsoft die parallele Installation von 32- und 64-Bit-Microsoft Office 2010 oder deren abhängigen Komponenten nicht unterstützt … Es tut mir leid, aber das ist keine sehr hilfreiche Antwort auf die Frage. F:Warum können die 32- und 64-Bit-Versionen von Microsoft Access Database Engine 2010 Redistributable (AccessDatabaseEngine.exe und AccessDatabaseEngine_X64.exe) nicht beide auf demselben Computer installiert werden? A:Microsoft unterstützt die parallele Installation von 32- und 64-Bit-Microsoft Office 2010 nicht. Das ist keine Antwort, das wiederholt mit anderen Worten nur die Frage. F:Warum kann ich das nicht tun? A:Weil wir es nicht unterstützen. F:Warum können Sie es nicht unterstützen? A:Weil wir es nicht unterstützen.

Als Problemumgehung habe ich AccessDatabaseEngine_X64.exe mit dem /passive-Schlüssel verwendet, der eine Koexistenz der 64-Bit-Version des Anbieters mit der 32-Bit-Office-Version ermöglicht. Es ist zu beachten, dass Microsoft diese Methode nicht offiziell unterstützt. Darüber hinaus gibt es Warnungen bezüglich möglicher Probleme mit der Kompatibilität.

Als ich den Treiber AccessDatabaseEngine_x64.exe installiert habe … MS Office Pro Plus startet einen MS-Konfigurationsprozess, der bis zu ein oder zwei Minuten dauern kann, bevor ein Dokument oder Office-Programm geöffnet wird . Wenn Office 2010 32 Bit installiert ist und wenn 64-Bit ace mit /passive installiert ist , dann erhalten Sie **jedes** Mal, wenn Sie Access 2010 ausführen, eine automatische Installationsroutine, die auf die 32-Bit-Treiber für Office zurücksetzt .

In meinem Fall (Office 2013 Pro Plus, SQL Server 2012 Developer Ed., Windows 8.1) gab es keine sichtbaren Probleme (Klopf auf Holz). Dennoch möchte ich hinzufügen, dass es so und ohne jegliche Verbindlichkeiten ist.

Laden Sie AccessDatabaseEngine_x64.exe herunter, erstellen Sie einen Systemwiederherstellungspunkt (er scheint beim Aktualisieren von Office-Komponenten automatisch erstellt zu werden) und führen Sie ihn über die Befehlszeile aus. Hier sind die möglichen Schlüssel:

Im Gegensatz zu Bild 2 wird die Installation ausgeführt

Klicken Sie dann im Kontextmenü der Anbieter auf Aktualisieren:

Ich habe sehr schnell eine einfache xslx-Datei erstellt:

Erstellen Sie in SQL Server einen Verbindungsserver auf diesem Excel:

falls vorhanden (wählen Sie 1 aus sys.servers aus, wobei name ='XlsLnkSrv' ist) exec sp_dropserver @server ='XlsLnkSrv', @droplogins ='droplogins'exec sp_addlinkedserver @server ='XlsLnkSrv', @srvproduct ='ACE 12.0' , @provider ='Microsoft.ACE.OLEDB.12.0', @datasrc ='C:\Temp\Sample.xlsx', @provstr ='Excel 12.0; HDR=Ja'

Skript 1

Lesen Sie:

wähle * aus Openquery (XlsLnkSrv, 'Wähle * aus [Sheet1$]')

Skript 2

Ist es erfolgreich? Nein!

Msg 7399, Level 16, State 1, Line 1
Der OLE DB-Anbieter «Microsoft.ACE.OLEDB.12.0» für den Verbindungsserver «XlsLnkSrv» hat einen Fehler gemeldet. Der Provider hat keine Informationen über den Fehler gegeben.
Msg 7303, Level 16, State 1, Line 1
Das Datenquellenobjekt des OLE DB-Providers «Microsoft.ACE.OLEDB.12.0» für kann nicht initialisiert werden Verbindungsserver «XlsLnkSrv».

Trotzdem erfolgreich!

Ebenso

select * from openrowset('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;Database=C:\Temp\Sample.xlsx;HDR=Yes', 'Select * from [Sheet1$]') 

Zuerst müssen wir Folgendes tun:

exec sp_configure 'erweiterte Optionen anzeigen', 1;reconfigure;exec sp_configure 'Ad-hoc Distributed Queries', 1;reconfigure

Skript 3

Abschließend möchte ich anmerken, dass der 64-Bit-Anbieter den 32-Bit-Anbieter ersetzt hat. Wenn wir eine Verbindung für Sample.xslsx im Datenfluss des DTS-Pakets erstellen, erhalten wir einen Initialisierungsfehler von Microsoft Office 12.0 Access Database Engine OLE DB Provider, was logisch korrekt ist, da devenv.exe 32-Bit ist, während der Anbieter ist 64-Bit. Um das Verhalten wiederherzustellen, ist es notwendig, den 32-Bit-Office-Anbieter wiederherzustellen (hier). In diesem Fall können wir den verlinkten Server jedoch nicht verwenden. Um den Verbindungsserver zum Laufen zu bringen, gehen Sie zum Anfang des Artikels.