次のクエリを実行しようとしています。
SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
'Excel 12.0;Database=C:\Somefile.xlsx',
'SELECT * FROM [Sheet$]')
しかし、私はこのエラーを受け取ります:
Cannot initialize the data source object of OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)".
私は以下を試しました:
sp_configure 'show advanced options', 1;
RECONFIGURE;
sp_configure 'Ad Hoc Distributed Queries', 1;
RECONFIGURE;
GO
そして:
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
[サーバーオブジェクト]-> [リンクサーバー]-> [プロバイダー]に移動すると、Microsoft.ACE.OLEDB.12.0が表示されます。
Acess Database Engine x64がインストールされ、すべてのOffice製品が64ビットであり、SQL Serverも64ビットです。
重要な場合は、すべてのユーザーがUsersフォルダーのTempフォルダーにアクセスできます。
(これらはすべて、この質問に対する同様の回答で見つけた提案です)
編集:SQL Server 2014を使用します。
Excelスプレッドシートを閉じて、管理者としてSSMSを実行していることを確認してください。
私は このブログ からそれを機能させるために必要な2つの不足している手順を見つけました。
1)Tempフォルダーの権限を確認します
これは、プロバイダーがデータの取得中に一時フォルダーを使用するために必要です。フォルダーは、ローカルシステムアカウントとネットワークドメインアカウントのどちらを使用するかに応じて、次のいずれかになります。
ネットワークアカウントの場合、フォルダーは
:\ Windows\ServiceProfiles\NetworkService\AppData\Local\Tempローカルシステムアカウントの場合
:\ Windows\ServiceProfiles\LocalService\AppData\Local\Tempこのフォルダーを右クリックして、コードを実行するアカウントへの読み取り書き込みアクセス権を付与します。
2)割り当てられたMemToLeaveメモリ領域を確認します
- SQL Server構成マネージャー->サービス-> SQLServerサービスを開きます。
- 右クリックしてプロパティを選択します。
- 詳細タブに移動し、-g512を追加します。スタートアップパラメータプロパティに追加すると、問題が解決します。
このMSDN記事 の手順に従うと、AllowInProcess
がなくても機能します。コアとなる指示は次のとおりです。
リンクサーバークエリを実行できるようにするには、リンクサーバーのプロパティでRPC OUTをtrueに設定します。
アウトプロセスプロバイダーでリンクサーバーをセットアップするために必要な権限:
DCOMCNFGで以下の設定を確認します。開始->実行–> Dcomcnfg
コンポーネントサービス->マイコンピュータ--->プロパティ
以下のオプションが[デフォルトのプロパティ]タブで設定されていることを確認します。
- 「このコンピューターで分散COMを有効にする」がチェックされています。
- デフォルト認証=接続。
- デフォルトの偽装レベル=識別または偽装。
コンポーネントサービス->マイコンピュータ-> DCOM Config-> MSDAINITIALIZE
- MSDAINITIALIZEを右クリック->プロパティ->セキュリティ
- SQL Serverサービスアカウント(SQLログインを使用してSQLサーバーに接続している場合)またはWindowsユーザーアカウントを、[起動とアクティブ化のアクセス許可]、[アクセス許可]、および[構成アクセス許可]に追加します。
- これらのアカウントに完全な権限を与えます。
サーバーを再起動します
私もこの問題に遭遇し、あなたと同じように手順を実行しました、最後に私はあなたと同じようにエラーに遭遇しました。最後に、私はSuperUserアカウントを使用し、このスクリプトを以下のように使用し、問題は解決しました。
SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
'Excel 12.0;HDR=Yes;IMEX=1;Database=C:\Somefile.xlsx',
'SELECT * FROM [Sheet$]')