Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Excel 32 bits et SQL Server 64 bits

Quoi de plus simple que de récupérer les données d'un tableau Excel dans SQL Server ?

Il existe de nombreuses façons d'accomplir cette tâche. Vous pouvez utiliser les services d'intégration (anciennement DTS) ou importation et exportation assistant, qui est le même sous le capot. Une autre façon consiste à créer une simple application ADO.NET . Vous pouvez utiliser le serveur lié mécanisme, qui vous permet de voir tout objet accessible par ODBC / OLE DB sous la forme d'une table (une collection de tables) ou le résultat d'une requête ad hoc.

C'était jusqu'à ce que l'architecture 64 bits cesse d'être quelque chose de la classe haut de gamme et arrive sur les ordinateurs portables des développeurs et des utilisateurs. Il est peu probable qu'un utilisateur typique installe un serveur de base de données, alors qu'il est normal qu'un développeur dispose d'un serveur SQL 64 bits sur une machine 64 bits avec MS Office 32 bits. Cependant, dans ce cas, l'utilisation d'Excel ou d'Access avec des serveurs liés SQL Server peut être un défi car les pilotes sont 32 bits. Il n'y a pas de fournisseurs disponibles pour MS Office, bien que j'en ai un installé sur mon PC.

Ainsi, une tentative d'utilisation d'Excel ou d'Access avec des serveurs liés SQL Server, comme décrit dans la documentation, entraînera l'erreur suivante :

Msg 7302, Niveau 16, État 1, Ligne 1

Impossible de créer une instance du fournisseur OLE DB « Microsoft.ACE.OLEDB.12.0 » pour le serveur lié…

Alors, que faire ?

Installez le fournisseur 64 bits, qui est disponible en téléchargement sur Microsoft Access Database Engine 2010 Redistributable. Nous obtenons l'erreur suivante lors du processus d'installation :

Si Office 32 bits n'est pas installé sur l'ordinateur, vous ne recevrez pas cet avertissement.

Dois-je choisir entre la version 64 bits ou 32 bits de MS Office et la version 64 bits ou 32 bits de SQL Server ? Désinstaller une version et en installer une autre n'est pas une solution flexible. De plus, ce n'est pas toujours possible. Examinons la question qu'une personne a posée sur MSDN :

La base de données MS Access est un environnement de production sur le site du client, et je n'ai pas la possibilité de la désinstaller et d'installer une version 64 bits. Il n'est pas non plus possible de désinstaller le serveur SQL 64 bits existant et d'installer la version 32 bits, bien sûr. Une installation supplémentaire d'un serveur SQL 32 bits, fournissant uniquement le lien vers MS Access serait alors la seule option. Je trouve cela assez horrible.

Je ne comprends pas cette partie.

Puisqu'il n'y a pas de Jet 64 bits, vous devez télécharger et installer la version 64 bits de «Microsoft Access Database Engine 2010 Redistributable». Merci pour votre réponse, mais lorsque j'installe AccessDatabaseEngine_X64.exe, j'obtiens l'erreur suivante (photo 1) Veuillez vous reporter à cet article de la base de connaissances : support.microsoft.com/kb/2269468 L'article dans le lien de votre dernier message indique de désinstaller tous les produits Office 32 bits. Cela n'a aucun sens pour moi, car le but est de se connecter à la base de données MS Access 32 bits… Vous devez installer la version 64 bits de "Microsoft ACE OLEDB Provider" pour vous connecter à un fichier Access (32 bits ou 64 bits) depuis SQL Server. Mais j'ai essayé d'installer le pilote 64 bits, mais il me donne une erreur d'installation… L'article précédent de la base de connaissances explique la cause et fournit la solution, vous pouvez vous y référer. Vous me faites tourner en rond.

Eh bien, le problème est de faire fonctionner la version 64 bits du fournisseur Microsoft ACE OLEDB avec Office 32 bits. Pourquoi il n'est pas possible de le faire directement est une grande question. Il y a beaucoup d'informations sur ce sujet :

Le fait qu'ils ne le puissent pas nous oblige à compiler deux versions différentes de notre application ; un spécifiquement pour la plate-forme x86 et un pour la plate-forme x64. Ensuite, nous devons en quelque sorte déterminer quelle version du pilote ACE est installée afin de savoir quelle version (32 ou 64 bits) de notre application installer. La vie serait beaucoup plus simple si nous pouvions simplement compiler notre application pour l'AnyCPU par défaut, puis les fournisseurs de données 32 et 64 étaient autorisés à être installés… Pourquoi ACE 32 et 64 bits ne peuvent-ils pas coexister ? Il est basé sur le fait que Microsoft ne prend pas en charge l'installation côte à côte de Microsoft Office 2010 32 et 64 bits ou de leurs composants dépendants… Je suis désolé, mais ce n'est pas une réponse très utile à la question. Q :Pourquoi les versions 32 et 64 bits de Microsoft Access Database Engine 2010 Redistributable (AccessDatabaseEngine.exe et AccessDatabaseEngine_X64.exe) ne peuvent-elles pas être installées sur le même ordinateur ? R :Microsoft ne prend pas en charge l'installation côte à côte de Microsoft Office 2010 32 et 64 bits. Cela ne répond pas, cela ne fait que répéter la question en d'autres termes. Q :Pourquoi ne puis-je pas le faire ? A:Parce que nous ne le soutenons pas. Q :Pourquoi ne pouvez-vous pas le soutenir ? A : Parce que nous ne l'acceptons pas.

Pour contourner ce problème, j'ai utilisé AccessDatabaseEngine_X64.exe avec la clé /passive qui permet à la version 64 bits du fournisseur de coexister avec la version Office 32 bits. Il convient de noter que Microsoft ne prend pas officiellement en charge cette méthode. De plus, il y a des avertissements concernant d'éventuels problèmes de compatibilité.

Lorsque j'ai installé le pilote AccessDatabaseEngine_x64.exe … MS Office Pro Plus démarre un processus de configuration MS qui peut prendre jusqu'à une minute ou deux avant l'ouverture d'un document ou d'un programme Office . Si office 2010 32 bits est installé et si ace 64 bits est installé avec /passive , puis **chaque** fois que vous exécutez Access 2010, vous obtenez une routine d'installation automatique qui réinitialise les pilotes 32 bits pour le bureau .

Dans mon cas (Office 2013 Pro Plus, SQL Server 2012 Developer Ed., Windows 8.1), il n'y avait aucun problème visible (je touche du bois). Néanmoins, je voudrais ajouter qu'il est tel quel et sans aucune responsabilité.

Téléchargez AccessDatabaseEngine_x64.exe, créez un point de restauration système (il semble être créé automatiquement lors de la mise à jour des composants Office) et exécutez-le à partir de la ligne de commande. Voici les clés possibles :

Contrairement à l'image 2, l'installation est lancée

Cliquez ensuite sur Actualiser dans le menu contextuel Fournisseurs :

J'ai créé un fichier xslx simple très rapidement :

Dans SQL Server, créez un serveur lié sur cet Excel :

si existe (sélectionnez 1 dans sys.servers où nom ='XlsLnkSrv') 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=Oui'

Scénario 1

Lire :

select * from openquery (XlsLnkSrv, 'Select * from [Sheet1$]')

Scénario 2

Est-ce réussi ? Non !

Msg 7399, Niveau 16, État 1, Ligne 1
Le fournisseur OLE DB « Microsoft.ACE.OLEDB.12.0 » pour le serveur lié « XlsLnkSrv » a signalé une erreur. Le fournisseur n'a donné aucune information sur l'erreur.
Msg 7303, Niveau 16, État 1, Ligne 1
Impossible d'initialiser l'objet source de données du fournisseur OLE DB « Microsoft.ACE.OLEDB.12.0 » pour serveur lié «XlsLnkSrv».

C'est quand même réussi !

De même,

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

Au début, nous devons faire ce qui suit :

exec sp_configure 'afficher les options avancées', 1;reconfigure;exec sp_configure 'Requêtes distribuées ad hoc', 1;reconfigure

Scénario 3

En conclusion, je voudrais noter que le fournisseur 64 bits a remplacé celui 32 bits. Si nous créons une connexion pour Sample.xslsx dans le flux de données du package DTS, nous obtiendrons un échec d'initialisation du fournisseur OLE DB du moteur de base de données Microsoft Office 12.0 Access, ce qui est logiquement correct, car devenv.exe est 32 bits, tandis que le fournisseur est 64 bits. Pour restaurer le comportement, il est nécessaire de restaurer le fournisseur Office 32 bits (ici). Cependant, dans ce cas, nous ne pouvons pas utiliser le serveur lié. Pour faire fonctionner le serveur lié, rendez-vous au début de l'article.