0

Excel 2010 と SQL サーバー 2008 を使用して、Excel から SQL サーバーにデータをインポートしています。でも不合格です。私のやり方をチェックしてもらえますか?

sp_CONFIGURE 'show advanced options',1
RECONFIGURE
GO

sp_CONFIGURE 'optimize for ad hoc workloads',1
RECONFIGURE
GO

sp_configure 'Ad Hoc Distributed Queries', 1
GO
RECONFIGURE


SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0','Excel 12.0;Database=C:\Users\anayak\AppData\Roaming\Microsoft\Templates\Book1.xlsx; HDR=YES;IMEX=1','SELECT * FROM [sheet1$]');

このエラーが発生する場所

OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)" returned message "Unspecified error".
Msg 7303, Level 16, State 1, Line 1
Cannot initialize the data source object of OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)".

Microsoft.ACE.OLEDB.12.0 用の Microsoft Access データベース エンジン 2010 再頒布可能パッケージをインストールしました。

しかし、コマンド「ODBCAD32.EXE」を使用して Excel のバージョンを確認すると、14.00.4760.1000 が表示されます。

次に、接続文字列を試してみました-

SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.14.0','Excel 14.0;Database=C:\Users\anayak\AppData\Roaming\Microsoft\Templates\Book1.xlsx; HDR=YES;IMEX=1','SELECT * FROM [sheet1$]');

しかし、再びうまくいきませんでした。

ここで私が間違っていることを教えてください。

ありがとう。

4

1 に答える 1

0

Re: 7303 エラー

SQL Server の分散クエリ、XLS からのデータ

したがって、主なエラーはおそらくこれです。

OLE DB provider "MICROSOFT.JET.OLEDB.4.0" for linked server "(null)" returned message "Unspecified error".
Msg 7303, Level 16, State 1, Line 1
Cannot initialize the data source object of OLE DB provider "MICROSOFT.JET.OLEDB.4.0" for linked server "(null)".

いくつかの権限を確認します。

Temp フォルダーのアクセス許可を確認する

これは、プロバイダーがデータの取得中に一時フォルダーを使用するために必要です。フォルダーは、ローカル システム アカウントまたはネットワーク ドメイン アカウントのどちらを使用するかに基づいて、次のいずれかになります。

ネットワーク アカウントの場合、フォルダは

\Windows\ServiceProfiles\NetworkService\AppData\Local\Temp

ローカル システム アカウントの場合、その \Windows\ServiceProfiles\LocalService\AppData\Local\Temp

このフォルダーを右クリックし、コードを実行するアカウント (またはグループ) に読み取り/書き込みアクセスを許可します。それは私のためにエラーを解決しました。

また

http://blogs.msdn.com/b/spike/archive/2008/07/23/ole-db-provider-microsoft-jet-oledb-4-0-for-linked-server-null-returned-message- unspecified-error.aspx

これは、SQL Server サービスが、サービスを開始したログイン (この場合は管理者/管理者ログイン) の一時 DSN を一時フォルダーに書き込もうとするためです。temp フォルダーは次のようなものです: C:\Documents and Settings\Admin\Local Settings\Temp .15 前述のように、OleDbProvider は、それを初期化したユーザー (この場合はユーザー/ユーザー) のコンテキストで常に実行されます。.16 ユーザー/ユーザーには、このフォルダー ( C:\Documents and Settings\Admin\Local Settings\Temp ) に対する権限がありません。SQLの実行時に FileMon を実行すると、次のことがわかります

sqlservr.exe:000 クエリ情報 C:\DOCUME~1\Admini~1\LOCALS~1\Temp アクセスが拒否されました 属性: エラー

ここまでを要約すると、SQL Server サービスは Admin/Admin として開始され、選択が行われると、OleDb プロバイダーが User/User によって呼び出されます。ここで、OleDb プロバイダーは一時ディレクトリに一時 DSN を作成しようとします。これは SQL Server サービス (管理者/管理者) の一時ディレクトリになりますが、ユーザー (この場合はユーザー/ユーザー) はこのフォルダーに対する書き込み権限を持っていません。そして、エラーが発生します。

これを解決するには 2 つの方法があります。

オプション 1 : マシンからログアウトし、SQL Server サービスを開始するアカウント (この場合は Admin/Admin) としてログインし、コマンド プロンプトを開始して「set t」(引用符なし) と入力すると、次のように表示されます。

TEMP=C:\DOCUME~1\Admin\LOCALS~1\Temp TMP=C:\DOCUME~1\Admin\LOCALS~1\Temp

これらは %TEMP% および %TMP% に設定された環境変数なので、そのフォルダーに移動し、右クリックして [プロパティ] -> [セキュリティ] を選択し、ユーザー (この場合はユーザー/ユーザー) を追加します。ユーザーのデフォルトはRead&Execute/List Folder Content/Read、これでは不十分です。Write も選択する必要があります。

ログアウトし、User/User として再度ログインして、SSMS からコマンドを再実行します。今回はうまくいくはずです。

オプション 2 : 管理者としてログオンし、TEMP および TMP 変数をたとえば C:\Temp に変更します。これにより、基本的に、Temp ディレクトリが Documents and Settings フォルダから移動されます。ただし、これを有効にするには、SQL サーバーを再起動する必要があります。

したがって、基本的には、SQL Server の起動時にスタートアップ アカウント (Admin/Admin) の Temp フォルダーが使用されますが、MICROSOFT.JET.OLEDB.4.0 は常に SQL コマンドを呼び出すユーザー (User/User) として実行されます。 )、このユーザーがその一時フォルダーへの書き込みアクセス権を持っていない限り、これは失敗します。

そこにあるすべてのセットアップを知らなくても、おそらくオプション 2 が推奨されるソリューションです。オプション 1 では、プロバイダーを呼び出すすべてのユーザーを追加する必要があるため、実用的ではない可能性があります。また、SQL Server サービスのスタートアップ アカウントを変更すると、そのアカウントの TEMP ディレクトリが使用され、この TEMP フォルダのすべてのユーザーに書き込み権限を与えるまで、エラーが再び表示されます...またはユーザーグループ (推奨)。

于 2014-08-12T15:23:09.827 に答える