web-dev-qa-db-fra.com

OpenRowSet - Comment configurer OLE DB Provider à utiliser pour les requêtes distribuées

J'ai un fichier Excel avec des données et je souhaite mettre à jour une table dans la base de données en fonction des données contenues dans le fichier Excel.

Pour ce faire, je veux utiliser la commande OpenRowSet. Mais j'obtiens l'erreur ci-dessous lorsque même je veux avoir un SELECT à partir des données Excel.

SELECT  exl.*
INTO #myExcelData
FROM OPENROWSET ('Microsoft.Ace.OLEDB.12.0'
,'Excel 12.0; Database=C:\Dev\ExcelDataImport.xlsx; Extended Properties=''Excel 12.0;HDR=NO;IMEX=1'
,'SELECT * FROM [Sheet1$]') AS exl
GO

OLE DB provider 'Microsoft.ACE.OLEDB.12.0' cannot be used for distributed queries because the provider is configured to run in single-threaded apartment mode.

Comme le dit le message d'erreur, je pense que je devrais configurer le Microsoft.ACE.OLEDB.12.0 pour pouvoir l'utiliser pour des requêtes distribuées comme OpenRowSet. Pour ce faire, j'ai exécuté la commande ci-dessous:

exec sp_configure 'Ad Hoc Distributed Queries', 1
RECONFIGURE

Message de sortie de la commande ci-dessus:

Configuration option 'Ad Hoc Distributed Queries' changed from 1 to 1. Run the RECONFIGURE statement to install.

Mais j'obtiens toujours la même erreur lorsque j'essaie d'exécuter la requête OpenRowSet. Pourriez-vous me donner quelques conseils pour résoudre ce problème et faire fonctionner OpenRowSet?

Mes environnements:

SQL Server 2008 R2, Excel Professional Plus 10 (32 bits)

Les fournisseurs que j'ai dans Linked Linked sont également les suivants:enter image description here

Merci d'avance.

4
Sky

après l'installation Redémarrez les services d'agent et de serveur

Activer le pilote OLEDB dans SQL Server

EXEC sp_configure 'show advanced options', 1;  
GO  
RECONFIGURE;  
GO  
EXEC sp_configure 'Ad Hoc Distributed Queries', 1;  
GO  
RECONFIGURE;  
GO
3
nitu bansal

Je recommanderais d'utiliser SSIS. Comme il a la flexibilité de vous permettre d'enregistrer le package et de le réutiliser pour des exécutions ultérieures, il peut même être planifié à l'aide du travail de l'agent sql.

Vous compromettez également la sécurité en autorisant l'exécution de requêtes distribuées ad hoc (en la changeant à 1).

J'ai essayé exactement la même requête que vous avez postée et cela fonctionne pour moi.

sp_configure 'Ad Hoc Distributed Queries',1
go
reconfigure with override
go
SELECT  exl.*
INTO #myExcelData
FROM OPENROWSET ('Microsoft.Ace.OLEDB.12.0'
,'Excel 12.0; Database=C:\Documents and Settings\kin\Desktop\test_kin.xlsx; Extended Properties=''Excel 12.0;HDR=NO;IMEX=1'
,'SELECT * FROM [Sheet1$]') AS exl
GO

select * from #myExcelData

enter image description here

1
Kin Shah

Je voudrais ajouter à la réponse de 'Kin' et ajouter que si vous exécutez un produit de bureau 32 bits et qu'il existe une version 32 bits d'AccessDatabaseEngine qui est utilisée pour les communications avec les produits de bureau (Excel), vous pouvez alors rencontrer ce problème, cependant, si vous passez à 64 bits, cela devrait disparaître. (et Ace apparaîtra sur vos serveurs liés.)

0
Slow Learner