SQL Server: impossible d'initialiser l'object de source de données du fournisseur OLE DB "Microsoft.ACE.OLEDB.12.0" pour le server lié "(null)"

J'essaie d'exécuter la requête suivante:

SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;Database=C:\Somefile.xlsx', 'SELECT * FROM [Sheet$]') 

Mais j'ai cette erreur:

 Cannot initialize the data source object of OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)". 

J'ai essayé ce qui suit:

 sp_configure 'show advanced options', 1; RECONFIGURE; sp_configure 'Ad Hoc Dissortingbuted Queries', 1; RECONFIGURE; GO 

Et:

 USE [master] GO EXEC master . dbo. sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0' , N'AllowInProcess' , 1 GO EXEC master . dbo. sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0' , N'DynamicParameters' , 1 GO 

Quand je vais dans 'Objets server' -> 'Serveurs liés' -> 'Fournisseurs', Microsoft.ACE.OLEDB.12.0 est listé.

Acess Database Engine x64 est installé, tous les produits Office sont 64 bits et mon SQL Server est également 64 bits.

Si c'est important, tous les users ont access au dossier Temp dans le dossier Users.

(Ce sont toutes les suggestions que j'ai trouvées dans des réponses similaires à cette question)

Edit: à l'aide de SQL Server 2014

Assurez-vous de fermer la feuille de calcul Excel et d'exécuter SSMS en tant qu'administrateur.

J'ai trouvé sur ce blog les deux étapes manquantes nécessaires pour que ça fonctionne pour moi.

1) Vérifiez les permissions sur le dossier Temp

Cela est nécessaire car le fournisseur utilise le dossier temporaire lors de la récupération des données. Le dossier peut être l'un des suivants selon que vous utilisez un count système local ou un count de domaine réseau.

Pour les counts réseau, le dossier est
: \ Windows \ ServiceProfiles \ NetworkService \ AppData \ Local \ Temp

et pour le count du système local son
: \ Windows \ ServiceProfiles \ LocalService \ AppData \ Local \ Temp

Faites un clic droit sur ce dossier et donnez-lui un access en écriture au count exécutant le code.

2) Vérifier la zone memory MemToLeave allouée

  • Ouvrez le Gestionnaire de configuration SQL Server -> Services -> service SQLServer.
  • Faites un clic droit et choisissez les propriétés.
  • Aller à l'onglet avancé et append -g512; à la propriété parameters de démarrage et il va résoudre le problème.

Vous pouvez également le faire fonctionner sans nécessiter AllowInProcess si vous suivez les instructions de cet article MSDN . Les instructions de base étant:

Pour pouvoir exécuter des requêtes server liées, définissez également RPC OUT sur true dans les propriétés du server lié.

Autorisations nécessaires pour configurer un server lié avec un fournisseur hors process:

Vérifiez les parameters ci-dessous dans DCOMCNFG: Démarrer -> Exécuter -> Dcomcnfg

  1. Services de composants -> Poste de travail —> properties
    Vérifiez que les options ci-dessous sont définies dans l'onglet "properties par défaut":

    • 'Activer Dissortingbuted COM sur cet ordinateur' est cochée.
    • Authentification par défaut = Connect.
    • Default Impersonation Level = Identifier ou Emprunter l'identité.
  2. Services de composants -> Mon ordinateur -> DCOM Config -> MSDAINITIALIZE

    • Faites un clic droit sur MSDAINITIALIZE -> properties -> Sécurité
    • Ajoutez le count de service SQL Server (s'il est connecté au server SQL à l'aide de la connection SQL) ou le count user Windows sous "Autorisations de lancement et d'activation", "Autorisations d'access" et "Autorisations de configuration".
    • Donner tous les droits sur ces counts.
  3. Redémarrez le server

J'ai également rencontré ce problème et fait les étapes en tant que vôtre, enfin j'ai rencontré l'erreur en tant que vôtre. À la fin, j'utilise un count SuperUser et utilise ce script comme ci-dessous et le problème a été résolu.

 SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;HDR=Yes;IMEX=1;Database=C:\Somefile.xlsx', 'SELECT * FROM [Sheet$]')