SQL Server OLEDB错误,没有详细信息

时间:2012-10-08 15:05:40

标签: sql sql-server sql-server-2000 oledb

我正在运行SQL Server代理作业,它使用存储过程执行多个操作,然后将一些数据导出到xls电子表格,并将电子表格发送到电子表格。它大部分时间都可以工作,但是每月有几次这个工作因错误而失败:

  

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

那么,原因是什么,我该如何预防呢?

1 个答案:

答案 0 :(得分:0)

当您调用OPENROWSET时,它会为Excel的OLEDB提供程序加载DLL。这些操作发生在SQL Server堆栈内存中。当对旧DLL(ActiveX / COM)进行大量调用时,堆栈可能会变满。您可以通过两种方式解决此问题:

1)您在TSQL代码之外进行这些操作。例如,您可以使用SSIS包,但必须更改代码才能使用OPENROWSET。您可以使用DTS向导完成大部分工作。这是我个人的推荐!

2)您还可以使用-g命令参数将SQL Server设置为具有更大的内存堆栈。我认为256 MB是默认值,您可以将其设置为512.为此,您需要打开SQL Server配置管理器。根据您的版本,您应该有一个地方可以更改“启动参数”