Enfin, après plusieurs tentatives infructueuses pour que SQL Server "parle" à une base de données Access - soit en tant que "serveur lié" dans SSMS, soit via OPENROWSET()
dans T-SQL - J'ai trouvé ce billet de blog qui proposait les trois (3) suggestions suivantes.
Tweak #1 :Paramètres du fournisseur OLE DB
Le fournisseur OLE DB pour ACE (ou Jet) doit avoir les options "Paramètre dynamique" et "Autoriser inprocess" activées. Dans SSMS, ouvrez le
Objets serveur> Serveurs liés> Fournisseurs
branche, faites un clic droit sur "Microsoft.ACE.OLEDB.12.0" (ou "Microsoft.Jet.OLEDB.4.0"), choisissez "Propriétés", et assurez-vous que ces options sont sélectionnées :
Ajustement n° 2 :Autorisations du dossier temporaire
C'est celui qui m'a laissé perplexe.
Apparemment, SQL Server doit écrire des informations dans un fichier temporaire lors de l'exécution d'une requête OLE DB sur une base de données Access. Étant donné que SQL Server s'exécute en tant que service, il utilise le dossier %TEMP% du compte sous lequel le service s'exécute.
Si le service SQL Server s'exécute sous le compte "Service réseau" intégré, le dossier temporaire est
%SystemRoot%\ServiceProfiles\NetworkService\AppData\Local\Temp
et s'il s'exécute sous le compte "Service local" intégré, le dossier temporaire est
%SystemRoot%\ServiceProfiles\LocalService\AppData\Local\Temp
Mon problème était que SSMS fonctionnait sous mon compte (pas NETWORK SERVICE) donc je n'avais qu'un accès en lecture au dossier Temp
Une fois que je me suis accordé les autorisations de modification sur ce dossier
et activé les requêtes OPENROWSET comme documenté dans une autre question ici, à savoir ...
EXEC sp_configure 'show advanced options', 1
RECONFIGURE
GO
EXEC sp_configure 'ad hoc distributed queries', 1
RECONFIGURE
GO
... ma requête a bien fonctionné :
Tweak #3 :memory_to_reserve
Bien que je n'aie pas eu besoin de l'utiliser dans mon cas, le blog susmentionné affirme également que l'ajustement du paramètre de démarrage "-g memory_to_reserve" pour le service SQL Server peut également aider à éviter des erreurs similaires. Pour ce faire :
- lancer le gestionnaire de configuration SQL Server
- faites un clic droit sur le service SQL Server (onglet "Services SQL Server") et choisissez "Propriétés"
- dans l'onglet "Avancé", ajoutez
-g512;
au paramètre "Paramètres de démarrage" - redémarrer le service SQL Server
Pour plus de détails sur le paramètre "memory_to_reserve", consultez l'article MSDN ici.