2013-01-20 61 views
0

我試圖以編程方式逐個運行一些SSRS訂閱。這些報告都是長期運行的,並且如果同時觸發,報告會一直失敗。目前,我們有大約四種不同的訂閱在一天內分發,確保它們不會發生衝突。不幸的是,這會浪費很多時間。一個接一個地運行多個訂閱一旦完成

我的解決方案是創建一個不計劃在所有相關報告中運行的訂閱,然後讓每個訂閱一個接一個地觸發每個訂閱,每個訂閱一旦完成後:

  1. 一個作業觸發第一次訂閱
  2. 使用WAITFOR命令會讓訂閱運行幾秒鐘。
  3. 使用WAITFOR命令檢查定期訂閱是運行(「待定」)
  4. 當WAITFOR檢查發現,該報告已發送作業觸發下一個訂閱 等等....

我知道代碼觸發訂閱:

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

我只需要知道如何使用WAITFOR同時做了檢查,然後到檢查結果採取相應措施。

回答

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' 

感謝, UT

1

根據你的問題中的信息,我肯定會說你有一個XY-problem:你應該真正處理你的查詢和報告的表現和/或locking strategy。儘管如此,如果你堅持通過連續運行報表來「解決」這個問題,我可能不會使用內置的訂閱,而是去尋找一個更加自定義的解決方案,以便獲得你想要的控制。使用SOAP API創建您自己的應用程序,腳本或任務,在報告中一次調用Render方法,等待每個報告完成後再開始下一個。如果您還沒有,請將執行超時設置爲足夠高的值,以便您的報告能夠很好地完成。

+0

的Jeroen嗨 - 感謝您的回答。不幸的是,這些報告已經過優化,超時設置爲0(最大),並且在一起觸發時仍然無法運行。目前的基礎設施相當陳舊,我們正在開發一個全新的系統(可能需要幾個月的時間)。與此同時,我只需要保持一切順利。 – UnoTurbo

相關問題