我正在运行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
那么,原因是什么,我该如何预防呢?
答案 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配置管理器。根据您的版本,您应该有一个地方可以更改“启动参数”