0

いくつかの SSRS サブスクリプションを次々とプログラムで実行しようとしています。レポートはすべて長時間実行され、同時にトリガーされると一貫して失敗します。現時点では、競合しないように、1 日を通して約 4 つの異なるサブスクリプションを提供しています。残念ながら、これはかなりの時間を無駄にする可能性があります。

これに対する私が持っている解決策は、問題のすべてのレポートで実行するようにスケジュールされていないサブスクリプションを作成し、1 つのジョブを取得して、各サブスクリプションの実行が終了したら、各サブスクリプションを次々とトリガーすることです。

  1. 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メソッドを一度に 1 つずつ呼び出し、各レポートが終了するのを待ってから次のレポートを開始します。まだ行っていない場合は、レポートが適切に終了するのに十分な長さに実行タイムアウトを設定します。

于 2013-01-20T11:09:12.693 に答える
0

OK - 私はこれを理解しました:

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

于 2013-01-23T13:05:43.833 に答える