web-dev-qa-db-fra.com

SQL Server: impossible d'initialiser l'objet source de données de OLE Fournisseur de base de données "Microsoft.ACE.OLEDB.12.0" pour le serveur 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 je reçois 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 Distributed 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

Lorsque je vais dans "Objets serveur" -> "Serveurs liés" -> "Fournisseurs", Microsoft.ACE.OLEDB.12.0 est répertorié.

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

Si cela compte, tous les utilisateurs ont accès au dossier Temp du dossier Utilisateurs.

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

Edit: Utilisation de SQL Server 2014.

11
S L

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

14
Vincent

J'ai trouvé dans ce blog les deux étapes manquantes nécessaires pour le faire fonctionner pour moi.

1) Vérifiez les autorisations 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 si vous utilisez un compte système local ou un compte de domaine réseau.

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

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

Faites un clic droit sur ce dossier et donnez-lui un accès en lecture-écriture au compte qui exécute le code.

2) Vérifiez la zone de mémoire 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 ajouter -g512; à la propriété de paramètres de démarrage et cela résoudra le problème.

Vous pouvez également le faire fonctionner sans avoir besoin de AllowInProcess si vous suivez les instructions dans le présent article MSDN . Les instructions de base étant:

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

Autorisations nécessaires pour configurer un serveur lié avec un fournisseur hors processus:

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

  1. Services de composant -> Poste de travail ---> Propriétés
    Vérifiez que les options ci-dessous sont définies dans l'onglet "Propriétés par défaut": 

    • L'option 'Activer Distributed COM sur cet ordinateur' est cochée. 
    • Authentification par défaut = Connecter. 
    • Niveau d'emprunt d'identité par défaut = Identifier ou emprunter l'identité.
  2. Services de composant -> Mon ordinateur -> Configuration DCOM -> MSDAINITIALIZE 

    • Faites un clic droit sur MSDAINITIALIZE -> Propriétés -> Sécurité 
    • Ajoutez le compte de service SQL Server (s'il est connecté au serveur SQL à l'aide de la connexion SQL) ou le compte d'utilisateur Windows sous "Autorisations de lancement et d'activation", "Autorisations d'accès" et "Autorisations de configuration". 
    • Donner tous les droits sur ces comptes. 
  3. Redémarrer le serveur

4
kjbartel

J'ai également rencontré ce problème et effectué les étapes comme le vôtre, enfin j'ai rencontré l'erreur comme le vôtre. En fin de compte, j'utilise un compte SuperUser et j'utilise ce script comme suit: 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$]')
1
Kevin Garnett