1

ストアド プロシージャを使用していくつかの操作を実行し、一部のデータを xls スプレッドシートにエクスポートして、そのスプレッドシートを電子メールで送信する SQL Server エージェント ジョブを実行しています。ほとんどの場合は機能しますが、月に数回、次のエラーでジョブが失敗します。

OLE DB プロバイダー 'Microsoft.Jet.OLEDB.4.0' がエラーを報告しました。プロバイダーは、エラーに関する情報を提供しませんでした。[SQLSTATE 42000] (エラー 7399)。ステップは失敗しました。

詳細なエラー メッセージについて Microsoft に感謝します。いずれにせよ、短期的な修正は通常、単純にジョブを再実行することです。通常、これは機能しますが、まれに機能しない場合があり、SQL Server インスタンスを再起動する必要があります。

私のコードがOLEDBと対話する方法は次のとおりです。

    Insert into OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'Excel 5.0;Database=\\Excel\POStatus\POStatus.xls;', 
   'SELECT * FROM [POStatus$]')  

Select --Tons of columns with tons of math and functions
FROM --5 tables joined together (left joins)
WHERE -- Tons of where conditions
Order by --Case statement for custom sorting

Set @vCommand =  'copy \\Excel\POStatus\POStatus.xls \\Excel\POStatus\POStatus_' + @vDate + '.xls'

EXEC master..xp_cmdshell @vCommand , NO_OUTPUT

... omitted for brevity...

  Set @nvSubject = ' POStatus ' + @vDate
  Set @nvMessage = ' This is an automated message, please respond to the IS department,  thank you ' 
  Set @nvMessage = @nvMessage + char(13) + char(10)

      Set @nvAttachments = '\\Excel\POStatus\POStatus_' + @vDate + '.xls'

      Exec master..xp_sendmail 
           @recipients = @nvRecipients , @copy_recipients = @nvCopy_recipients ,
           @subject = @nvSubject , @message = @nvMessage ,  
           @query = @nvQuery , @width = @iWidth , @attachments = @nvAttachments

では、これは何が原因で、どうすれば防ぐことができるでしょうか。

4

1 に答える 1

0

OPENROWSETを呼び出すと、Excel用のOLEDBプロバイダー用のDLLが読み込まれます。これらの操作は、SQLServerスタックメモリ内で行われます。古いDLL(ActiveX / COM)を何度も呼び出すと、スタックがいっぱいになる可能性があります。これは2つの方法で解決できます。

1)これらの操作はTSQLコードの外部で行います。たとえば、SSISパッケージを使用できますが、OPENROWSETを使用しないようにコードを変更する必要があります。DTSウィザードを使用して、ほとんどの作業を実行できます。これは私の個人的な推薦です!

2)-gコマンドパラメータを使用して、SQLServerのメモリスタックを大きくするように設定することもできます。256 MBがデフォルトであり、512に設定できると思います。これを行うには、SQLServer構成マネージャーを開く必要があります。バージョンによっては、「スタートアップパラメータ」を変更する場所が必要です。

于 2012-10-09T01:52:03.880 に答える