【问题标题】:Run multiple Subscriptions one after another once each has completed每次完成后依次运行多个订阅
【发布时间】:2013-01-03 14:56:32
【问题描述】:

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

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

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

我知道触发订阅的代码:

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

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

【问题讨论】:

    标签: tsql reporting-services


    【解决方案1】:

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

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

    【讨论】:

    • 嗨 Jeroen - 感谢您的回答。不幸的是,这些报告已经过优化,超时设置为 0(最大值),并且在一起触发时仍然无法运行。当前的基础设施相当陈旧,我们正在开发一个全新的系统(可能需要几个月的时间)。与此同时,我只需要保持一切顺利。
    【解决方案2】:

    好的 - 我已经想通了:

    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'
    

    谢谢, 犹他州

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-10
      相关资源
      最近更新 更多