sql >> データベース >  >> RDS >> Sqlserver

32ビットExcelおよび64ビットSQLServer

    SQL ServerのExcelテーブルからデータを取得するよりも簡単なことは何でしょうか?

    このタスクを実行する方法はたくさんあります。 統合サービスを利用できます (以前のDTS)またはインポートとエクスポート ウィザード、これは内部で同じです。もう1つの方法は、単純なADO.NETアプリを作成することです。 。 リンクサーバーを使用できます メカニズム。ODBC/OLEDB到達可能オブジェクトをテーブル(テーブルのコレクション)またはアドホッククエリの結果の形式で表示できます。

    64ビットアーキテクチャがハイエンドクラスのものではなくなり、開発者とユーザーのラップトップに登場するまではそうだった。一般的なユーザーがデータベースサーバーをインストールすることはほとんどありませんが、開発者が32ビットMSOfficeを搭載した64ビットマシンに64ビットSQLServerをインストールするのは通常のことです。ただし、この場合、ドライバーは32ビットであるため、SQLServerにリンクされたサーバーでExcelまたはAccessを使用するのは難しい場合があります。 PCにプロバイダーをインストールしていますが、MSOfficeで利用できるプロバイダーはありません。

    したがって、ドキュメントで説明されているように、SQL ServerにリンクされたサーバーでExcelまたはAccessを使用しようとすると、次のエラーが発生します。

    メッセージ7302、レベル16、状態1、行1

    リンクサーバー用のOLEDBプロバイダー«Microsoft.ACE.OLEDB.12.0»のインスタンスを作成できません…

    では、どうすればよいですか?

    64ビットプロバイダーをインストールします。これは、Microsoft Access Database Engine2010Redistributableからダウンロードできます。インストールプロセス中に次のエラーが発生します:

    32ビットOfficeがコンピューターにインストールされていない場合、この警告は表示されません。

    64ビットまたは32ビットバージョンのMSOfficeと64ビットまたは32ビットバージョンのSQLServerのどちらかを選択する必要がありますか?あるバージョンをアンインストールして別のバージョンをインストールすることは、柔軟なソリューションではありません。さらに、それが常に可能であるとは限りません。ある人がMSDNで提起した質問を見てみましょう:

    MS Accessデータベースは、お客様のサイトの実稼働環境であり、データベースを削除して64ビットバージョンをインストールすることはできません。もちろん、既存のSQLServer64ビットを削除して32ビットバージョンをインストールすることもできません。その場合、MSAccessへのリンクのみを提供するSQLServer32ビットの追加インストールが唯一のオプションになります。これはかなりひどいことだと思います。

    この部分がわかりません。

    64ビットのJetがないため、64ビットバージョンの«Microsoft Access DatabaseEngine2010再頒布可能パッケージ»をダウンロードしてインストールする必要があります。 ご回答ありがとうございますが、AccessDatabaseEngine_X64.exeをインストールすると、次のエラーが発生します (写真1) このKB記事を参照してください: support.microsoft.com/kb/2269468 最後のメッセージのリンクにある記事は、すべてのOffice32ビット製品を削除するように指示しています。目標は32ビットのMSAccessデータベースに接続することなので、それは私には意味がありません… SQL ServerからAccessファイル(32ビットまたは64ビット)に接続するには、64ビットバージョンの「MicrosoftACEOLEDBプロバイダー」をインストールする必要があります。 しかし、64ビットドライバをインストールしようとしましたが、インストールエラーが発生します… 前のKB記事では、原因を説明し、解決策を提供しています。参照してください。 あなたは私を輪になって導いてくれます。

    問題は、64ビットバージョンのMicrosoftACEOLEDBプロバイダーを32ビットOfficeで動作させることです。なぜこれを直接行うことができないのかは大きな問題です。このトピックに関する多くの情報があります:

    アプリケーションの2つの異なるバージョンをコンパイルするように強制することはできないという事実。 1つはx86プラットフォーム用で、もう1つはx64プラットフォーム用です。次に、インストールするACEドライバーのバージョンを何らかの方法で決定して、インストールするアプリケーションのバージョン(32ビットまたは64ビット)を確認する必要があります。デフォルトのAnyCPU用にアプリをコンパイルし、32ビットと64ビットの両方のデータプロバイダーをインストールできるようにすると、作業ははるかに簡単になります。32ビットと64ビットのACEが共存できないのはなぜですか。 これは、Microsoftが32ビットおよび64ビットのMicrosoftOffice2010またはそれらの依存コンポーネントのサイドバイサイドインストールをサポートしていないという事実に基づいています… 申し訳ありませんが、それは質問に対するあまり役に立たない答えです。 Q:Microsoft Access Database Engine 2010再頒布可能パッケージの32ビットバージョンと64ビットバージョン(AccessDatabaseEngine.exeとAccessDatabaseEngine_X64.exe)の両方を同じマシンにインストールできないのはなぜですか。 A:Microsoftは、32ビットと64ビットのMicrosoft Office 2010のサイドバイサイドインストールをサポートしていません。それは答えではなく、言い換えれば、質問を繰り返すだけです。 Q:なぜこれができないのですか? A:サポートされていないためです。 Q:なぜそれをサポートできないのですか? A:サポートされていないためです。

    回避策として、AccessDatabaseEngine_X64.exeを/passiveキーとともに使用しました。これにより64ビットバージョンのプロバイダーと32ビットOfficeバージョンの共存が可能になります。 Microsoftはこの方法を公式にサポートしていないことに注意してください。さらに、互換性に関する問題の可能性に関する警告があります。

    ドライバAccessDatabaseEngine_x64.exeをインストールしたとき …MSOfficePro Plusは、ドキュメントまたはOfficeプログラムが開くまでに最大1〜2分かかるMS構成プロセスを開始します。 Office 2010 32ビットがインストールされている場合、および64ビットエースが/passiveとともにインストールされている場合 その後、Access 2010を実行するたびに**自動インストールルーチンが実行され、オフィス用の32ビットドライバーにリセットされます

    私の場合(Office 2013 Pro Plus、SQL Server 2012 Developer Ed。、Windows 8.1)、目に見える問題はありませんでした(ノックオンウッド)。それでも、それは現状のままであり、いかなる責任も負わないことを付け加えたいと思います。

    AccessDatabaseEngine_x64.exeをダウンロードし、システムの復元ポイント(Officeコンポーネントの更新時に自動的に作成されるようです)を作成し、コマンドラインから実行します。可能なキーは次のとおりです。

    写真2とは異なり、インストールは実行されます

    次に、プロバイダーのショートカットメニューで[更新]をクリックします。

    簡単なxslxファイルをすばやく作成しました:

    SQL Serverで、このExcelにリンクサーバーを作成します。

    if exists (select 1 from sys.servers where name = 'XlsLnkSrv') exec sp_dropserver 
    @server = 'XlsLnkSrv', @droplogins = 'droplogins'
    
    exec sp_addlinkedserver @server = 'XlsLnkSrv', @srvproduct = 'ACE 12.0', 
    @provider = 'Microsoft.ACE.OLEDB.12.0', @datasrc = 'C:\Temp\Sample.xlsx', 
    @provstr = 'Excel 12.0; HDR=Yes'

    スクリプト1

    読む:

    select * from openquery (XlsLnkSrv, 'Select * from [Sheet1$]')

    スクリプト2

    成功しましたか?いいえ!

    メッセージ7399、レベル16、状態1、行1
    リンクサーバー«XlsLnkSrv»のOLEDBプロバイダー«Microsoft.ACE.OLEDB.12.0»がエラーを報告しました。プロバイダーはエラーに関する情報を提供しませんでした。
    メッセージ7303、レベル16、状態1、行1
    OLEDBプロバイダー«Microsoft.ACE.OLEDB.12.0»のデータソースオブジェクトを初期化できません。リンクサーバー«XlsLnkSrv»。

    それでも、成功しています!

    同様に、

    select * from openrowset('Microsoft.ACE.OLEDB.12.0',  
    'Excel 12.0;Database=C:\Temp\Sample.xlsx;HDR=Yes', 'Select * from [Sheet1$]')

    まず、次のことを行う必要があります。

    exec sp_configure 'show advanced options', 1;
    reconfigure;
    exec sp_configure 'Ad Hoc Distributed Queries', 1;
    reconfigure

    スクリプト3

    結論として、64ビットプロバイダーが32ビットプロバイダーに取って代わったことに注意したいと思います。 DTSパッケージのデータフローでSample.xslsxの接続を作成すると、Microsoft Office 12.0 Access Database Engine OLE DBプロバイダーの初期化エラーが発生します。これは、devenv.exeが32ビットであるのに対し、プロバイダーは32ビットであるため論理的に正しいものです。 64ビットです。動作を復元するには、32ビットのOfficeプロバイダー(ここ)を復元する必要があります。ただし、この場合、リンクサーバーは使用できません。リンクサーバーを機能させるには、記事の冒頭に移動してください。


    1. プロバイダー名前付きパイププロバイダーエラー40は、SQLServerエラー2への接続を開くことができませんでした

    2. WorkbenchMySQLクライアントを使用してデータベースに接続する方法

    3. T-SQLで日付に日を追加する方法

    4. クエリ文字列にもかかわらず、SQLCOUNTを使用すると-1を返すExecuteNonQuery