web-dev-qa-db-ja.com

リンクサーバーnullのOLE DBプロバイダーMicrosoft.Jet.OLEDB.4.0のインスタンスを作成できません

T-SQLクエリを使用して、TableデータからExcelにエクスポートしようとしています。少し研究した後、私はこれを思いついた

INSERT INTO OPENROWSET ('Microsoft.Jet.OLEDB.4.0', 
                        'Excel 8.0;Database=G:\Test.xls;', 
                        'SELECT * FROM [Sheet1$]') 
SELECT * 
FROM   dbo.products 

上記のクエリを実行すると、このエラーが発生します

メッセージ7302、レベル16、状態1、行7リンクサーバー "(null)"のOLE DBプロバイダー "Microsoft.Jet.OLEDB.4.0"のインスタンスを作成できません。

だから解決策のためにインターネットを通過し、以下のリンクを得た

https://blogs.msdn.Microsoft.com/spike/2008/07/23/ole-db-provider-Microsoft-jet-oledb-4-0-for-linked-server-null-returned- message-unspecified-error /

上記のリンクでは、TEMPOPENROWSETフォルダー内にいくつかのファイルまたはフォルダーを作成するため、CドライブTEMPフォルダーにフォルダーを作成するには管理者である必要があると言っていました

私はこれをMy Home PCで行っており、管理者です。それでも同じエラーが発生します。

SQL SERVER詳細

Microsoft SQL Server 2016(RC1)-13.0.1200.242(X64)2016年3月10日16:49:45 Copyright(c)Microsoft Corporation Enterprise Evaluation Edition(64-bit)on Windows 10 Pro 6.3(ビルド10586:)

問題を解決するためのポインタは高く評価されます

更新:すでにAd Hoc Distributed Queries

以下のクエリを実行しました

EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.Jet.OLEDB.4.0', N'AllowInProcess', 1
GO 
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.Jet.OLEDB.4.0', N'DynamicParameters', 1
GO 

今、このエラーが発生しています

メッセージ7438、レベル16、状態1、行7 32ビットOLE DBプロバイダー「Microsoft.Jet.OLEDB.4.0」は、64ビットSQL Serverでインプロセスでロードできません。

25

わかりました、私はそれを私のために働かせました、そして、SOは今日私に投稿させてくれるようです。

MS SQL Server 2012とOffice 2013があります。これは非常に細心の注意が必要なようです。そのため、特定のバージョンに調整する必要があります。

  1. Windows用のMicrosoft.ACE.OLEDB.12.0をダウンロードします。64ビットバージョンは次の場所にあります。 https://www.Microsoft.com/en-us/download/details.aspx?id=13255
  2. サーバーにインストールします。
  3. SQL Serverを実行しているユーザーを確認し、ローカルサービスアカウントまたはC:\ Windows\ServiceProfiles\NetworkService\AppData\Localの場合、ユーザーが一時ディレクトリC:\ Windows\ServiceProfiles\LocalService\AppData\Local\Tempにアクセスできることを確認します。ネットワークサービスアカウントの場合は\ Temp。
  4. 「アドホック分散クエリ」を設定し、次のようなMicrosoft.ACE.OLEDBファイルを有効にします。

SP_CONFIGUREコマンドは次のとおりです。

SP_CONFIGURE 'show advanced options', 1; 
GO 
RECONFIGURE; 
SP_CONFIGURE 'Ad Hoc Distributed Queries', 1; 
GO 
RECONFIGURE; 
EXEC sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'AllowInProcess', 1   
EXEC sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'DynamicParam', 1

より新しいSQL Server 2014'DynamicParameters'の代わりに'DynamicParam'を使用していました

EXEC sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'DynamicParameters', 1

次のようにmsexcl40.dllを登録してください。

regsvr32 C:\Windows\SysWOW64\msexcl40.dll
36
quest4truth

Sp_configure/RECONFIGUREを確認してください...

sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'Ad Hoc Distributed Queries', 1;
GO
RECONFIGURE;
GO

詳細については、次のリンクを参照してください。

https://technet.Microsoft.com/en-us/library/aa259616(v = sql.80).aspx

http://blog.sqlauthority.com/2010/11/03/sql-server-fix-error-ms-jet-oledb-4-0-cannot-be-used-for-distributed-queries-なぜなら、プロバイダーが使用されてアパートモードで実行されるからです

2
JimR

動作します!!!まことにありがとうございます。 64ビットWinサーバー2012R2専用。作業スクリプト全体を、(私にとっては)一緒に結合するのが容易ではない、上からの部分的に繰り返される部分を繰り返してみましょう。

1)Windows用のMicrosoft.ACE.OLEDB.12.0をダウンロードします。64ビットバージョンは次の場所にあります。 https://www.Microsoft.com/en-us/download/details.aspx?id=13255

2)それぞれの列(この場合は名前とクラス)でExcelファイルを作成します。

3)以下のコードを実行します。

sp_configure 'show advanced options', 1;  
RECONFIGURE;
GO 
sp_configure 'Ad Hoc Distributed Queries', 1;  
RECONFIGURE;  
GO 

/* -- Not sure commented bits are necessary but I also have run them
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.Jet.OLEDB.4.0', N'AllowInProcess', 1
GO 
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.Jet.OLEDB.4.0', N'DynamicParameters', 1
GO 

-- below two lines failed with: Msg 2787, Level 16, State 1, Procedure sp_MSset_oledb_prop, Line 106 Invalid format specification: '%1!.'.
    EXEC sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'AllowInProcess', 1   
EXEC sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'DynamicParam', 1

-- but works all two as below:
EXEC sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'AllowInProcess', 1   
EXEC sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'DynamicParameters', 1
-- Succeded to run after success with Excel so does not looks like necessary


*/

INSERT INTO OPENROWSET('Microsoft.ACE.OLEDB.12.0', 
'Excel 8.0;Database=C:\testing.xlsx;', 
'SELECT Name, Class FROM [Sheet1$]') 
SELECT [Name],[Class] FROM Qry_2
GO
1
FerroPont