0

我正在尝试以编程方式一个接一个地运行一些 SSRS 订阅。这些报告都是长时间运行的,如果同时触发,则会始终失败。目前,我们在一天中分布着大约四种不同的订阅,以确保它们不会发生冲突。不幸的是,这会浪费很多时间。

我为此提供的解决方案是创建一个未计划在所有相关报告上运行的订阅,然后在每个完成运行后获得一个作业来触发每个订阅:

  1. 一个作业触发第一个订阅
  2. 使用 WAITFOR 命令给订阅运行几秒钟的时间。
  3. 使用 WAITFOR 命令定期检查订阅是否正在运行(“待定”)
  4. 当 WAITFOR 检查发现报告已发送时,作业触发下一次订阅,依此类推....

我知道触发订阅的代码:

exec [ReportServerWSS].dbo.AddEvent @EventType='SharedSchedule', @EventData='011e83ff-344a-416a-83cb-1a9281e4205b'

我只需要知道如何在进行检查时使用 WAITFOR,然后对检查结果做出响应。

4

2 回答 2

1

根据您问题中的信息,我肯定会说您有一个XY 问题:您应该真正致力于查询和报告的性能和/或锁定策略

话虽如此,如果您坚持通过连续运行报告来“解决”问题,我可能不会使用内置订阅,而是选择更自定义的解决方案,以便您拥有所需的控制权。创建您自己的应用程序、脚本或使用SOAP API的任务,一次调用一个报表上的Render方法,等待每个报表完成后再开始下一个报表。如果您还没有这样做,请将执行超时设置为足够高的值,以便您的报告能够顺利完成。

于 2013-01-20T11:09:12.693 回答
0

好的 - 我已经想通了:

DECLARE @SubscriptionStatus AS nvarchar(260)


EXEC msdb.dbo.sp_start_job '4B7FA89E-0B56-4ED1-9A0F-37E5D03318CB' /*First long running    report*/
WAITFOR DELAY '00:00:30'

SET @SubscriptionStatus = (SELECT LastStatus FROM Subscriptions Where subscriptionid =    'E156FD91-E7F9-43EC-8B73-28622834EACB')


CheckSubscription1:
    IF @SubscriptionStatus = 'Pending'
    BEGIN
        PRINT 'The First long running Subscription is still running'
        WAITFOR DELAY '00:01:00'
        SET @SubscriptionStatus = (SELECT LastStatus FROM Subscriptions Where     subscriptionid = 'E156FD91-E7F9-43EC-8B73-28622834EACB')
    END

IF @SubscriptionStatus = 'Pending'
    GOTO CheckSubscription1

ELSE

EXEC msdb.dbo.sp_start_job '6D3300BC-ACA9-4EEE-A5F9-546635B585E0' /*Second long running    report*/
WAITFOR DELAY '00:00:30'

SET @SubscriptionStatus = (SELECT LastStatus FROM Subscriptions Where subscriptionid =        'AD54215A-5B7F-48B2-81B2-52C299875AD6')

CheckSubscription2:
    IF @SubscriptionStatus = 'Pending'
    BEGIN
        PRINT 'The second long running Subscription is still running'
        WAITFOR DELAY '00:01:00'
        SET @SubscriptionStatus = (SELECT LastStatus FROM Subscriptions Where     subscriptionid = 'AD54215A-5B7F-48B2-81B2-52C299875AD6')
    END

IF @SubscriptionStatus = 'Pending'
    GOTO CheckSubscription2

ELSE

EXEC msdb.dbo.sp_start_job '84FD876A-1945-405E-A344-6279E27DCD68' /*Third long running     report*/

WAITFOR DELAY '00:00:30'

SET @SubscriptionStatus = (SELECT LastStatus FROM Subscriptions Where subscriptionid =    '8F446935-5450-458F-9076-7AD9FC78D456')

CheckSubscription3:
    IF @SubscriptionStatus = 'Pending'
    BEGIN
        PRINT 'The third long running Subscription is still running'
        WAITFOR DELAY '00:01:00'
        SET @SubscriptionStatus = (SELECT LastStatus FROM Subscriptions Where    subscriptionid = '8F446935-5450-458F-9076-7AD9FC78D456')
    END

IF @SubscriptionStatus = 'Pending'
    GOTO CheckSubscription3

ELSE

PRINT 'All long running report run'

谢谢,犹他州

于 2013-01-23T13:05:43.833 回答