SSRS 计划报告未执行 -

SSRS scheduled reports not executing -

我们计划在整个星期 运行 发布大量报告。一些报告也被设置为代理作业报告并使用 SP_send_dbmail 以 HTML 格式发送报告。在过去一周左右的时间里,多份报告未能发送,而其他报告则在同一天发送。 IT 一直是一个间歇性问题,因为有些天似乎所有的报告都会通过,但我没有任何警报来通知我失败的报告。

我从 \Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER\Reporting Services\LogFiles 查看了报告服务器的日志文件; 此错误消息经常出现:

ERROR: PollingMaintenance: Restarting maintenance thread for the following exception:  This method or property cannot be called on Null values.
   at System.Data.SqlClient.SqlBuffer.get_String()
   at Microsoft.ReportingServices.Library.InstrumentedSqlDataReader.<>c__DisplayClass3d.<GetString>b__3c()
   at Microsoft.ReportingServices.Library.SqlBoundaryWithReturn`1.Invoke(Method m)
   at Microsoft.ReportingServices.Library.EventQueueWorker.GetNextQueueItem(IDataRecord record)
   at Microsoft.ReportingServices.Library.QueuePollWorker.ProcessData(IDataReader reader)
   at Microsoft.ReportingServices.Library.DBPoll.PollingFunction()
   at Microsoft.ReportingServices.Library.DBPoll.PollingMaintenance().
library!WindowsService_827!8d4!07/10/2015-05:54:19:: i INFO: PollingMaintenance: Polling cycle completed.

除此之外,我在 LastStatus 下的 ExecutionLogStorage table 中没有看到任何有用的信息(只是在一些记录上说 rsProcessAborted)。

我也试过运行使用此查询来查找失败的报告,但今天失败的报告不会出现:

SELECT
    c.Name AS [ReportName],
    sb.[Description] AS [SubscriptionDescription],
    sb.DeliveryExtension AS [DeliveryType],
    sb.LastStatus AS [LastRunStatus],
    sb.LastRunTime AS [LastRunTime],
    c.Path AS [ReportPath],
    'http://sql-server/Reports/Pages/Report.aspx?ItemPath='+REPLACE(REPLACE(C.[Path],'/','%2f'),' ','+')+'&SelectedTabId=PropertiesTab&ViewMode=List&SelectedSubTabId=SubscriptionsTab' AS [SubscriptionLink],
    sc.ScheduleID AS [SQLAgentJobName],
    sb.SubscriptionID
FROM
    ReportServer.dbo.ReportSchedule AS RS
    INNER JOIN ReportServer.dbo.Schedule sc ON rs.ScheduleID = sc.ScheduleID
    INNER JOIN ReportServer.dbo.Subscriptions sb ON rs.SubscriptionID = sb.SubscriptionID
    INNER JOIN ReportServer.dbo.[Catalog] c ON rs.ReportID = c.ItemID AND sb.Report_OID = c.ItemID
WHERE
    (sb.LastStatus LIKE 'Failure%' OR sb.LastStatus LIKE 'Error%' OR sb.LastStatus LIKE '%not valid%')
    order by lastruntime asc

此问题现已解决; 这需要深入研究事件 table,我们发现了一个计划更新旧订阅报告的代理作业。该报告在一个月前引起了问题,我删除了订阅并使用相同的查询创建了一个新报告。更新报告的作业似乎在事件 table 中对事件进行排队,并且由于没有订阅该报告,它们一直在超时。前几天我们清理了这些事件,只剩下少数事件,但所有报告都按计划发布。我在上面最后一条评论中发布的链接涵盖了为我们指明正确方向的主要领域。