データを含むExcelファイルがあり、Excelファイルに含まれているデータに基づいてデータベースのテーブルを更新したい。
そのためには、OpenRowSet
コマンドを使用します。しかし、ExcelデータからSELECT
を取得したい場合でも、以下のエラーが発生します。
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.
エラーメッセージが言うように、私はMicrosoft.ACE.OLEDB.12.0
は、OpenRowSet
のような分散クエリに使用できるようにします。そのために、以下のcommondを実行しました。
exec sp_configure 'Ad Hoc Distributed Queries', 1
RECONFIGURE
上記のコマンドからの出力メッセージ:
Configuration option 'Ad Hoc Distributed Queries' changed from 1 to 1. Run the RECONFIGURE statement to install.
しかし、それでもOpenRowSet
クエリを実行しようとすると同じエラーが発生します。この問題を解決してOpenRowSetを機能させる方法のヒントを教えてください。
私の環境:
SQL Server 2008 R2、Excel Professional Plus 10(32ビット)
また、次のようにリンクサーバーにあるプロバイダー:
前もって感謝します。
インストール後、エージェントとサーバーサービスを再起動します。
SQL ServerでOLEDBドライバーを有効にする
EXEC sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
EXEC sp_configure 'Ad Hoc Distributed Queries', 1;
GO
RECONFIGURE;
GO
SSISの使用をお勧めします。パッケージを保存して後続の実行に再利用できる柔軟性があるため、SQLエージェントジョブを使用してスケジュールすることもできます。
また、アドホック分散クエリを実行できるようにする(クエリを1に変更する)ことで、セキュリティが低下しています。
私はあなたが投稿したのとまったく同じクエリを試しましたが、それは私にとってはうまくいきます。
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
'Kin'の回答に追加し、32ビットのオフィス製品を実行していて、オフィス製品(Excel)への通信に使用されるAccessDatabaseEngineの32ビットバージョンがある場合は、この問題が発生する可能性があります。ただし、64ビットに変更すると、これは表示されなくなります。 (そして、エースはあなたのリンクされたサーバーに現れます。)