3

データをインポートできるようにするには、Excel テンプレートを別のフォルダーにコピーする必要があります。以下は、私が使用している2つのSQLステートメントです。

ステートメント 1:

exec xp_cmdshell 'copy C:\inetpub\wwwroot\app_data\export_templates\myExport.xlsx C:\inetpub\wwwroot\app_data\tmp\myExport130301172218.xls'

ステートメント 2:

insert into 
OPENROWSET('Microsoft.ACE.OLEDB.12.0'
    , 'Excel 12.0;Database=C:\inetpub\wwwroot\app_data\tmp\myExport130301172218.xls;'
    , 'SELECT * FROM [Sheet1$]')  
SELECT * FROM vw_shrub 

上記の SQL ステートメントを個別に実行すると、正常に動作します。しかし、それらを一緒に実行すると、次のエラーが発生します。

リンク サーバー "(null)" の OLE DB プロバイダー "Microsoft.ACE.OLEDB.12.0" は、"Microsoft Access データベース エンジンはオブジェクト 'Sheet1$' を見つけることができませんでした。オブジェクトが存在すること、およびその名前とスペルを確認してください。パス名を正しく入力してください。'Sheet1$' がローカル オブジェクトでない場合は、ネットワーク接続を確認するか、サーバー管理者に連絡してください。".

メッセージ 7350、レベル 16、状態 2、行 2
リンク サーバー "(null)" の OLE DB プロバイダー "Microsoft.ACE.OLEDB.12.0" から列情報を取得できません。

問題は、アプリケーションから両方を単一のリクエストとして渡したいことです。したがって、それらを一緒に実行する必要があります。それらの間にGOを追加すると、Management Studioでそれらを一緒に実行できることがわかりました。しかし、アプリケーションからリクエストを渡すと、GO を使用できません。

4

2 に答える 2

1

別の方法として、この 2 行を SQL Server エージェント ジョブの 2 つの異なるステップにして、1 つの命令で実行することもできます。

sp_start_job nameOfYourJob

ジョブの 2 つのステップは、間に GO があったように機能します。

于 2013-03-10T16:11:49.853 に答える
0

exec ステートメントの後に GO を追加しようとしましたか?

SQL Server に接続されているアカウントには、SQL Temp ディレクトリへの読み取り/書き込みアクセス権がありますか? 私の理解では、SQL は xls ファイルを一時ディレクトリにコピーし、ユーザーに管理者権限または Windows の一時ディレクトリへの読み取り/書き込み権限がない場合、接続は失敗します。

于 2013-03-04T22:24:31.310 に答える